標籤:sftp windows
最近由於公司的規定要把所有的FTP禁止掉,只能用SFTP,所以只能在程式中加入相關支援.由於也要在WINDOWS中加入,折騰了好幾天.網路上一般都是一兩句話說這個支援,那個可以,可是真的做起來麻煩不少.因此覺得有必要把這個過程寫下來供人蔘考,省得大家走彎路.
前提條件:
1. Visual Studio 2012
2. 靜態串連所有程式.動態串連比較麻煩,還要msvcrt.dll之類的一起打包,因此我們一律用靜態串連.
首先找到的是libcurl,libcurl的網路說明裡什麼都支援,包括SFTP,可是後來發現底層要openssl才行,後來又發現光openssl還不行,SFTP是通過libssh2來做的,libssh2的底層其實也是openssl,編譯openssl需要用perl來執行一些指令碼.所以一共需要perl, openssl, libssh2, libcurl.
第一步,安裝perl, 這個是公司電腦技術服務人員給裝的,想來很簡單,不說了.
第二步, 編譯openssl
1. 下載版本1.0.1m,最新版本是1.0.2,為什麼不用呢?因為那個需要一個叫netwide assembler的工具,需要另外下載,否則編譯出錯, 即使你設定了set OPTS=no-asm. 版本說明裡面根本沒有寫.
2. 在Visual Studio 2012的命令環境中運行
cd ms
set OPTS=no-asm
perl Configure VC-WIN32
perl util\mkfiles.pl >MINFO
perl util\mk1mf.pl %OPTS% VC-WIN32 >32.mak
perl util\mkdef.pl 32 libeay > ms\libeay32.def
perl util\mkdef.pl 32 ssleay > ms\ssleay32.def
nmake -f 32.mak
(參考32all.bat)
第三步, 編譯libssh2
1. 下載版本1.5.0
2. 找到libssh2.dsw,雙擊在visual studio 中開啟
3. 選擇OpenSSL Lib Release
4. 在項目屬性中加入openssl的INCLUDE目錄
5. 把/MD 改成 /MT (MD是動態串連,顯然是libssh2.dsw的bug)
6. 編譯
第四步, 編譯libcurl
1. 下載版本7.40.0, 最新版本是7.41.0,但是編譯不了!網頁上沒有7.40.0的串連,只好自己依樣畫葫蘆了.
2. 把openssl和libssh庫和標頭檔copy到curl-7.40.0\..\deps中, 把libssh2.lib 改名成 libssh2_a.lib
3. 在Visual Studio 2012的命令環境中運行
nmake /f Makefile.vc mode=static VC=11 WITH_SSL=static WITH_SSH2=static DEBUG=no
4. 在build出的目錄中運行curl.exe -V
curl -V
curl 7.40.0 (i386-pc-win32) libcurl/7.40.0 OpenSSL/1.0.1m WinIDN libssh2/1.5.0
Protocols: dict file ftp ftps gopher http https imap imaps ldap pop3 pop3s rtsp
scp sftp smtp smtps telnet tftp
Features: AsynchDNS IDN IPv6 Largefile SSPI Kerberos SPNEGO NTLM SSL
完成
第五步,為什麼有第五步啊?
本來是不該有的.但是
curl_easy_setopt(curl, CURLOPT_URL, url.c_str());
url一定要靜態變數!否則就崩潰到curl內部了!
本文出自 “BlueFeather” 部落格,請務必保留此出處http://bluefeather.blog.51cto.com/9720359/1633919
Windows下在C++程式中加入對SFTP的支援