zoukankan      html  css  js  c++  java
  • MinGW环境libssh2安装

      由于实习工作中要用到基于sftp协议开发一个网络程序,同时要实现运行在Windows平台上,找来找去就这个libssh2库好用,在网络上算是有那么一点点的文档可以看。这个库还不是现成的,还要进行源代码编译,自己弄,看起来很复杂的样子。最可恨的是居然还不是简单的make&&make install 就可以的,还要依赖库。linux下好像简单的yum一下就可以的样子(羡慕)。整个环境搭建起来用了2天了。写一下,以后没准还要看到。

    0.安装msys-mingw环境

      先下载这个环境 http://liquidtelecom.dl.sourceforge.net/project/mingw/Installer/mingw-get-setup.exe

      

      我这里下载1 2 5 7这几个。选择后就下载吧。我是下载在D盘目录下,下载完运行这个程序D:MinGWmsys1.0msys.bat 双击,然后就可以愉快的玩耍了。在里面随便测试几个命令,看是否正确安全。

    1.安装zlib

      下载地址:https://github.com/madler/zlib 或者 http://www.zlib.net/ 自行下载

      

      编译完成后把目录下的 libz.a zconf.h zlib.h 三个文件复制出来,用于libssh2中 ,在此之前要判断是否可以用。测试用的程序

     1 #include <stdio.h>
     2 #include "zlib.h"
     3 
     4 int main()
     5 {
     6     //原始数据
     7     const unsigned char strSrc[]="hello world!
    
     8                                   aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试
     9                                   aaaaa bbbbb ccccc ddddd aaaaa bbbbb ccccc ddddd中文测试 中文测试";
    10 
    11     unsigned char buf[1024]={0},strDst[1024]={0};
    12     unsigned long srcLen=sizeof(strSrc),bufLen=sizeof(buf),dstLen=sizeof(strDst);
    13 
    14     printf("Src string:%s
    Length:%d
    ",strSrc,srcLen);
    15     //压缩
    16 
    17     compress(buf,&bufLen,strSrc,srcLen);
    18     printf("
    After Compressed Length:%d
    ",bufLen);
    19     printf("Compressed String:%s
    ",buf);
    20     //解压缩
    21 
    22     uncompress(strDst,&dstLen,buf,bufLen);
    23     printf("
    After UnCompressed Length:%d
    ",dstLen);
    24     printf("UnCompressed String:%s
    ",strDst);
    25     return 0;
    26 }
    View Code

    2.安装openssl

      下载地址 http://www.openssl.org/source/openssl-1.0.1f.tar.gz 其他版本同理下载
      msys mingw 自带perl 所以不用安装。进入openssl-1.0.1f目录下,然后运行
      ./Configure -DHAVE_STRUCT_TIMESPEC -L/mingw/lib -lz -lws2_32 --prefix=/mingw zlib mingw

      

      然后直接make 即可

      

      原来是上面zlib没有安装到对应的目录

      

      是这一级目录

      好吧复制完我们继续make

      

      这又是什么鬼,吓得我赶紧百度一下

      打开出错的文件,修改如下

       

      另外两个文件rc5test.c  jpaketest.c也同样处理

      第一次知道原来c语言还可以用,这种方式来玩,简直666666666

      不说了,继续make ,还好make工具可以跳过以前已经编译过的文件,不然每次10多分钟,不就哭了。

      

      终于make编译通过了,然后make install进行安装,这好像又是一个艰难的过程。不说了,写个例子测试一下。

      

      用于测试openssl库的例程

     1 #include <stdio.h>
     2 
     3 #include "openssl/ssl.h"
     4 
     5 int main ()
     6 {
     7     SSL_CTX* ctx = NULL;
     8     const SSL_METHOD* meth = NULL;
     9 
    10     OpenSSL_add_ssl_algorithms();    // 初始化
    11     SSL_load_error_strings();        // 为打印调试信息作准备
    12     meth = TLSv1_client_method();    // 采用什么协议(SSLv2/SSLv3/TLSv1)在此指定
    13     ctx = SSL_CTX_new (meth);
    14     printf("%X
    ", ctx);
    15 
    16     return 0;
    17 }
    View Code

      这次要注意了,上面的命令设置openssl安装在/mingw下的,所以同理把D:MinGWmsys1.0mingw下的所有文件复制到D:MinGW 这个目录下进行覆盖。

    3.安装libssh2库

      下面这个是准备编译libssh2了,下载地址http://www.libssh2.org/download/libssh2-1.5.0.tar.gz 进入到所在目录然后运行下面命令(前两步中要把libz 和 libssl 复制到编译器的include和lib目录)

      ./configure --prefix=/mingw --with-libz --with-openssl

      

      接下来make && make install 

      

      同理将D:MinGWmsys1.0mingw 目录下所有文件都复制到 D:MinGW目录下。到这里就表示结束了。

    4.编写测试例程

      下面这个是基于openssh的程序

     1 #include <stdio.h>
     2 #include <libssh2.h>
     3 #include <libssh2_sftp.h>
     4 
     5 int main()
     6 {
     7     LIBSSH2_SESSION * session;
     8     LIBSSH2_SFTP *sftp_session;
     9     LIBSSH2_SFTP_HANDLE *sftp_handle;
    10     int ret = libssh2_init(LIBSSH2_INIT_NO_CRYPTO);
    11 
    12     session = libssh2_session_init();
    13 
    14     libssh2_session_free(session);
    15     libssh2_exit();
    16     return 0;
    17 }
    View Code

      写个编译代码把, mingw32-g++ main.cpp -o main -lxxx -lxxx -lxxx  , 这些xxx就是连接库了,你自己写一下,就会出现下面这些错误。不要问我怎么知道,我弄了2天,一直出现未定义错误,编译源代码10次左右,换了4-5个版本。各种找资料修改。

      错误举例

      

      

      我遇到的错误各式各样的都有,一开始还不知道要加入gdi32这个库(这个是在http://stackoverflow.com了解到的,http://stackoverflow.com/questions/6999086/linker-errors-when-statically-linking-libcurlopenssl-to-my-project ),还有从其他地方了解到-lssl要在lcrypto之前,以前有做过一个例子关于Windows socket的,那个-lws2_32库也是要放在最后才可以用,否则就各种错。那时也是弄了一两天,怎么没有长记性呢??这个链接库先后问题,以后一定要记得,至于网上关于这方面的讲解基本都没有,难道他们没有遇到这个坑吗?还是在linux真正环境下没有这个问题,而Windows环境下用的是dll和lib的连接库,而不是linux的so和a文件。所以没有这个问题,至于像我这种偏偏在Windows下用*nux下的东西,注定是坑,嗯,是这样的,一定是这个样子的。(肯定不是因为我长得丑,连编译器都欺负我。)

      下面这种是我试出来的一种可行编译顺序

    $ g++ -o ssl main.cpp -lssh2 -lssl -lcrypto -lz -lws2_32 -lgdi32

      

    5.吐槽一下

      为了实现libssh2这个开发环境,查看了晚上仅有的文章,弄了那么久,把过程中的伤心事说一下。

      网上,对于源代码编译libssh2的中文博客,目前应该只有 搭建ssh2协议的开发环境:openssl+libssh2库+Visual Studio 2008(http://blog.csdn.net/vsuan/article/details/4342015 )这一篇了,安装里面说的,安装了vs2008,安装了nasm工具,安装了activeperl工具实现perl环境,前两步还好,最后一步的libssh2安装就不行了,各种出错。(查了一下好像是本地或者什么地方的版本不对,或者我忘记配置什么把)。 没有办法,在http://slproweb.com/products/Win32OpenSSL.html 下载了win32Openssl-1.0.1m.exe 别人编译好的文件,http://www.winimage.com/zLibDll/index.html 下载zlib编译好的文件。从csdn上下载了编译好的libssh2文件,最后整合还是不能用,各种找不到。同时找了一些其他方式的安装方法,总之各种坑。最后找到这个How to Compile libssh2 for Windows with MinGW 文章,终于是可以用了,还不错也是mingw环境,这下可以玩耍了。

    6.文件下载

      文件中包含我已经编译好的文件,和几个例程,编译好的库,复制到include和lib应该就可以了,我把文件放到我的codeblock里面是可以编译libssh2的程序的。

      http://files.cnblogs.com/files/wunaozai/libssh2.7z 

      编译环境是用 mingw-get-setup.exe 下载的环境,其他三个库为 libssh2-1.5.0、openssl-1.0.1f、zlib-1.2.8

    参考资料(这个有太多了,写个关键的)

    http://blog.csdn.net/b_h_l/article/details/17010161 

  • 相关阅读:
    [UE4]九宫格图片拉伸
    [UE4]IsValid方法妙用
    [UE4]蓝图函数库
    [UE4]创建KillInfoPanel
    [UE4]条件语句Select
    [UE4]控件模板参数
    [UE4]控件模板
    [UE4]不推荐的UI更新方式
    [UE4]事件驱动的UI更新:事件调度器
    [UE4]更新UI的三种方式
  • 原文地址:https://www.cnblogs.com/wunaozai/p/4495441.html
Copyright © 2011-2022 走看看