因需要C++下的http下载库,于是找到了cURL和avhttp,不过后者是基于boost的,我不会这个也没有计划去学习,所以选择了cURL
网上搜索了下,口碑不错,应该是一个经过了时间考验的库。但是为了编译它折腾了好几个小时,于是记录了一下编译过程,分享出来以免后来者走弯路
注意!此编译记录没有包含zlib和ssl
cURL官网下载地址:http://curl.haxx.se/download.html
找到源码包,我这里下载的是7.32.0版:http://curl.haxx.se/download/curl-7.32.0.zip
打开curl-7.32.0\vs\vc8\lib目录下的vc8libcurl.vcproj文件,VS会提示升级工程,下一步即可
可能是由于作者并不使用VS的缘故,VC工程里有些设置问题导致不能直接编译,需要稍作修改
1.打开工程属性 > C\C++ > 常规 > 附加包含目录。这里的包含目录是"..\include",而这个目录根本就不存在,它应该指向"curl-7.32.0\include"才对,所以把这里改成"..\..\..\include"。
2.打开工程属性 > C\C++ > 预处理器 > 预处理器定义。这里有个默认宏"BUILDING_LIBCURL",把它改成"CURL_STATICLIB"。这样,那些接口函数就不会被声明为导出函数了。
3.打开工程属性 > C\C++ > 库管理器 > 常规 > 附加依赖项。添加ws2_32.lib和wldap32.lib,这是cURL必须依赖的。
4.把"libcurl.rc"从工程中移除,它只是版本信息,只会让文件大了几百KB,果断去掉!
然后编译即可,得到libcurl.lib文件
一般我们使用静态库都是为了二次封装或调用,不是所有功能都会用的上,如果能去掉用不到的部分那将可以减少文件的大小
而cURL预设了一些宏可以开关相关协议支持,见 http://curl.haxx.se/docs/install.html
HTTP_ONLY disables all protocols except HTTP
CURL_DISABLE_FTP disables FTP
CURL_DISABLE_LDAP disables LDAP
CURL_DISABLE_TELNET disables TELNET
CURL_DISABLE_DICT disables DICT
CURL_DISABLE_FILE disables FILE
CURL_DISABLE_TFTP disables TFTP
CURL_DISABLE_HTTP disables HTTP
为了测试lib文件,新建一个控制台程序,把curl.h头文件包含进来,并导入上面生成的libcurl.lib文件即可
#include "stdafx.h" #include "inc/curl.h" #include <iostream> #pragma comment(lib, "libcurl.lib") int _tmain(int argc, _TCHAR* argv[]) { CURL *curl; CURLcode res; curl = curl_easy_init(); if (curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } system("pause"); return 0; }
但这里还是编译出错,提示了
1>libcurl.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_init
1>libcurl.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_setopt
1>libcurl.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_perform
1>libcurl.obj : error LNK2001: 无法解析的外部符号 __imp__curl_easy_cleanup
原因是cURL通过宏来定义接口函数声明,所以要保证测试工程里的宏定义和libcurl.lib的宏一致。
在工程属性里的预处理器里添加"CURL_STATICLIB"即可。