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:\MinGW\msys\1.0\msys.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!\n\
 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\nLength:%d\n",strSrc,srcLen);
15     //壓縮
16 
17     compress(buf,&bufLen,strSrc,srcLen);
18     printf("\nAfter Compressed Length:%d\n",bufLen);
19     printf("Compressed String:%s\n",buf);
20     //解壓縮
21 
22     uncompress(strDst,&dstLen,buf,bufLen);
23     printf("\nAfter UnCompressed Length:%d\n",dstLen);
24     printf("UnCompressed String:%s\n",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\n", ctx);
15 
16     return 0;
17 }
View Code

  這次要注意了,上面的命令設置openssl安裝在/mingw下的,所以同理把D:\MinGW\msys\1.0\mingw下的所有文件復制到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:\MinGW\msys\1.0\mingw 目錄下所有文件都復制到 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 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM