需求
在一个封闭的生产环境中实现一个ftp客户端。win7/xp 32位,vs2010/vc6.0。
方案
通过多方搜索,目前有两种方案
1、用MFC里的CFTPConnection与CInternetSession类来实现。
方案1的好处是MFC现成的,不用下载第三方库。缺点是不跨平台,可移植性差。
2、用libcurl。
方案2的好处是移植性好,可以跨多个平台,功能健全,缺点是有一个学习过程,另外还需要再封装基础的操作函数。
一开始stackoverflow上没咋看到提CFTPConnection这个方案,清一色的多是libcurl、libssh之类的,以为MFC走不通,没现成的,所以开始了一轮libcurl的折腾。才有了这篇博文。CFTPConnection此处就不细讲如何使用。
OK,进入正题。
vs2010编译libcurl
1、下载libcurl源码
下载链接 https://curl.haxx.se/download.html
第一项即可。
2、找到工程
3、如何定制openssl、libssh2、winssl之类。
libcurl引用了一些第三方的东西,如winssl,libssh2,openssl,如果使用的话,需要单独下载相关的源码或者库。既然我是在一个封闭的环境,只用ftp就够了,完全不想再用ssh、ssl之类的劳什子。所以,引发了第三个问题。
也就是说,可选,不想要就不要。但是工程是默认要加这些依赖的。。。直接编译会报错。
fatal error C1083: 无法打开包括文件:“libssh2.h”: No such file or directory
上面这张图片有3个点,1是输出框的出错信息,2是定位到的文本行,3是具体宏定义的位置。
将项目属性中c/c++下预处理中相关宏定义清理下。不用的HAVE_LIBSSH2_H、HAVE_LIBSSH_LIBSSH_H,都删除。。。。因为你没有下载相关的文件,当然就没有。。。。当然,如果具体需要这两个劳什子。这里有两个链接,可以直达这两个资源的源头。具体官方的网站也可以看看。
libssh2:https://github.com/libssh2/libssh2
openssl:https://github.com/openssl/openssl
4、工程其他配置
工程配置---->链接器---->输入 只保留3项ws2_32.lib;wldap32.lib;和最后一个变量导入。
OK,前面都配置好了之后,还可能会报一个错误。
LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
将C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin目录下的cvtres.exe改名为cvtres_BAK.exe。避免冲突就行。当然别的解决方案可以将配置中的清单文件设置为否,不过我的两台机器上,一个用效,一个无效。但是改cvtres.exe名字肯定是有效的。
搞定。至于其他的配置,是动态库还是静态库,动态的省内存空间,加载时可能慢点,这个都不是问题。个人感觉推荐动态库的方式。具体设置也是在工程配置中的预处理栏目。