Windows下在C++程序中加入对SFTP的支持

最近由于公司的规定要把所有的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内部了!

时间: 2024-10-07 05:46:24

Windows下在C++程序中加入对SFTP的支持的相关文章

gcc和MinGW的异同(在cygwin/gcc做的东西可以无缝的用在linux下,没有任何问题,是在windows下开发linux程序的一个很好的选择)

cygwin/gcc和MinGW都是gcc在windows下的编译环境,但是它们有什么区别,在实际工作中如何选择这两种编译器. cygwin/gcc完全可以和在linux下的gcc化做等号,这个可以从boost库的划分中可以看出来端倪,cygwin下的gcc和linux下的gcc完全使用的是相同的Toolsets.所以完全可以和linux一起同步更新gcc版本,而不用担心问题,并且在cygwin/gcc做的东西(不用win32的)可以无缝的用在linux下,没有任何问题.是在windows下开发

使用Code::blocks在windows下写网络程序

使用Code::blocks在windows下写网络程序 作者 He YiJun – storysnail<at>gmail.com 团队 ls 版权 转载请保留本声明! 本文档包含的原创代码根据General Public License,v3 发布 GPLv3 许可证的副本可以在这里获得:http://www.gnu.org/licenses/gpl.html 本文档根据GNU Free Documentation License 1.3发布 GFDL1.3许可证的副本可以在这里获得:ht

在windows下编写R程序包

每个R的使用者总会遇到这样的问题,用R时间长了攒了几个自己写的函数需要经常调用,用source命令调用感觉不够方便,最好怎么办呢?编一个自己的包,只需安装一次就可多次调用,方便自己和他人使用.我把自己制作R包的步骤记了下来,主要参考了统计之都的一篇帖子(http://cos.name/cn/topic/15991)和<Creating R Packages: A Tutorial>中的部分内容,对一些过时的东西做了更正,以供大家参考吧. 在windows下编写R程序包

在windows下的QT编程中的_TCHAR与QString之间的转换

由于在windows下的QT编程中,如果涉及到使用微软的API,那么不可避免使用_TCHAR这些类型,因此在网上查了一下,其中一个老外的论坛有人给出了这个转换,因此在这里做一下笔记 : )#ifdef UNICODE #define QStringToTCHAR(x)     (wchar_t*) x.utf16() #define PQStringToTCHAR(x)    (wchar_t*) x->utf16() #define TCHARToQString(x)     QString:

windows下python脚本程序的运行

c:\python33\python.exe c:\python33\trycoding.py windows下python脚本程序的运行,布布扣,bubuko.com

Windows下,通过程序设置全屏抗锯齿(多重采样)的方法

这里说的全屏抗锯齿,不是基于着色器的FXAA之类的方式,而是兼容性更好的,基于固定管线的多重采样方式. 先来说一下开发环境,我用的是VC2013+GLEW1.11. 要通过程序设置多重采样,首先需要进入控制面板,确定抗锯齿的设置是“根据应用程序而定” ,当然,这个设置的具体名称,不同的显卡厂商有不同的叫法. 接下来,就是重点了. Windows下要通过程序设置多重采样,必须使用wglChoosePixelFormatARB这个函数.目前网上基本都是自己去获取这个函数的接口地址,其实根本不用这么麻

windows下node.js+sublime中安装coffeescript

node.js中安装Coffeescript 1.我的node.js安装目录 2.node.js 全局模块所在目录 3.node.js安装coffeescript 1 npm install -g coffee-script 至此理论上node.js中已经安装好coffeescript编译器了,不过我第二次安装时遇到了问题,就是-w参数使用时会报错,Error:watch EINVAL 我在第一安装时,没遇到任何问题,不过那个时候,没有明确的安装步骤.当时找到的一些资料讲的并不明确.不过-c参数

一个复杂的Windows下的socket程序

上节演示了 Linux 下的 socket 程序,这节来看一下 Windows 下的 socket 程序.异样,server.cpp 为效劳器端代码,client 为客户端代码.效劳器端代码 server.cpp: #include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") //加载 ws2_32.dll int main(){ //初始化 DLL WSADATA ws

一个简单的Windows下的socket程序

服务器端代码server.cpp: 1 #include <stdio.h> 2 #include <WinSock2.h> 3 #pragma comment(lib,"ws2_32.lib") //加载ws2_32.dll 4 5 int main() 6 { 7 //初始化DLL 8 /************************************************************************/ 9 /*调用WSASta