Fork me on GitHub

Windows下编译libcurl和使用

Windows下编译libcurl和使用

之前在Linux下使用过wget和curl,感觉使用起来都很简单,没什么困难之处,最近在windows下要使用libcurl,编译和使用的时候踩了不少坑,特此记录一下。

认识libcurl

libcurl是一个跨平台的开源的网络协议库,它支持http,https,ftp,telnet等协议,同样它支持https证书授权,使用起来简便不像其他的网络库一样复杂,想要知道更多关于libcurl的介绍,可以到官网https://cur.heaxx.se上去了解,在这里不做过多介绍。

编译libcurl

在编译libcurl之前,需要先做如下配置

下载文件

配置目录

为了不愿跟博主一样再踩过很多坑以后,才编译成功,在你的盘符根目录下新建一个文件夹名叫libcurl-ssl,将下载的三个压缩包解压到该目录。

ActiveState安装:

执行安装程序,默认安装路径或者自定义路径都可以。

zlib编译

  1. 在你创建的文件夹下打开zlib-1.2.11\contrib\vstudio\vc14\zlibvc.sln,选择编译release版本,平台x86,x64自选。
  2. 编译过后,会在x86或者x64文件夹下的ZlibDllRelease文件夹中生成zlibwapi.dll和zlibwapi.lib文件

openssl编译

这一步算是比较麻烦,也容易出错的地方,因为只能通过命令行来进行编译

  1. 在开始菜单中找到自带的vs本机工具命令提示符,你的vs版本 和要进行编译的平台自己选择。我用的是vs2015 x86
  2. 使用cd命令进入到你创建的文件夹下的openssl-1.0.2k中
  3. 命令行输入perl Configure VC-WIN32 no-asm
  4. 命令行输入ms\do_ms.bat
  5. 命令行输入nmake -f ms/ntdll.mak

耐心等待编译结束,抽根烟回来就编译好了,查看编译过程只要不出现”stop”,”error”的,就算成功了,如果出现错误的话,最好是把整个文件夹删了,重新解压编译,如果留有编译失败的文件,再进行编译的话它可能会提示”无法解析xxx”。

接着将openssl-1.0.2k->inc32->openssl中所有的.h文件和openssl-1.0.2k->out32dll中的libeay32.lib、libeay32.dll、ssleay32.lib、ssleay32.dll一起复制到curl-7.55.0->lib->opensll中,如果lib文件夹下没有openssl,建立一个就可以了。

libcurl编译

libcurl直接使用vs进行编译,编译平台选择DLL DEBUG-DLL OpenSSL

  1. 打开curl-7.55.0->projects->Windows->VC14->curl-all.sln,可能vs会提示升级工程,确定即可。
  2. 将libcurl设为启动项目,将libcurl的资源文件libcurl.rc移出。
  3. 右键项目选择属性->C/C++->预处理器->预处理器定义,将”BUILDING_LIBCURL”改成”CURL_STATICLIB”。接口函数不会被声明为导出函数
  4. 选择属性->链接器->输入->附加依赖项添加 libeay32.lib;ssleay32.lib;ws2_32.lib;wldap32.lib;前两个是为了openssl,后两个是curl必须依赖的。

在编译成功后curl-7.55.0->build->Win32->VC14->DLL DEBUG-DLL OpenSSL文件夹中会生成有libcurld.lib和libcurld.dll(注意名字不是libcurl)

测试

  1. 创建一个控制台应用,例如项目名叫Test,在你的Test项目下创建include文件夹,将curl-7.55.0->include目录下的curl文件夹,复制过去。
  2. 新建lib文件夹,将libcurl编译的libcurld.dll和libcurld.lib复制到lib。
  3. 将libcurld.dll和之前OpenSSL生成的libeay32.lib、ssleay32.dll各复制一份到项目exe文件下,否则会报错。会提示定位不到序数,编译的过,运行不过。
  4. 选择配置属性->C/C++->预处理器->预处理器定义,添加CURL_STATICLIB。
  5. 属性中的附加包含目录,附加库目录都在代码实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include"curl/curl.h"
using namespace std;

#pragma comment(lib,"libcurld.lib")

size_t CallBack(void *ptr, size_t size, size_t nmemb, void *stream)
{
string *str = (string*)stream;
cout << *str << endl;
(*str).append((char*)ptr, size*nmemb);
return size * nmemb;
}

int main()
{
easy_global_init(CURL_GLOBAL_ALL);

CURL *curl=easy_curl_init();
if(curl)
{
curl_easy_setopt(curl,CURLOPT_URL,"www.baidu.com");

string result;
//设置ssl
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, false);
curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, false);
//开启调式信息
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, CallBack);
curl_easy_setopt(curl,CURLOT_WRITEDATA,(void *)&result);
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1);
curl_easy_setopt(curl,CURLOPT_TIMEOUT,3);

CURLcode res=curl_easy_perform(curl);
if(CURLE_OK!=res)
{
cerr<<"curl_easy_perform() failed"<<endl;
}
}
return 0;
}
您的赞赏是对我最大的支持,谢谢!