【C/C++】 VS2010静态编译cURL

因需要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"即可。


你可能感兴趣的:(【C/C++】 VS2010静态编译cURL)