概述

VS C++下可以使用CURL工具进行网络通信,但是要用到CURL必须有dll和lib文件。所以这个要自己编译生成这些文件。

编译环境及版本

  • Windows 10 x64
  • VS 2013
  • curl 7.53.0
  • libssh2-1.8.0
  • openssl-1.0.2k

下载

首先去​​CURL官网​​下载最新版本。目前最新版本是curl 7.53.0。

同时到​​http://windows.php.net/downloads/php-sdk/deps/vc11/x86/​​这里下载编译好的其他工具,这样就不需要在编译这些工具了。主要下载这几个:libssh2、openssl、zlib(zlib可能用不上)。另外下载还需要注意是下载32位的还是64位的。编译64位的libcurl不能使用32位的扩展包。

解压并打开工程

解压curl后到目录curl-7.53.0\projects\Windows下选择一个本地有对应版本的VC工程打开,我用的是VS2013,我选择最近的VC12工程就行了。

打开curl-all.sln后可以在解决方案看到有两个项目
curllibcurl,我要生成curl的库文件自己使用,就选择libcurl项目进行生成。

编译CURL库

下面开始解决编译错误

无法打开包括文件: “winsock2.h”

错误 1 error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory F:\VS\PACKET\curl-7.53.0\lib\curl_setup.h 256 1 libcurl

解决方法:项目属性–>配置属性–>常规–>平台工具集–>选择VS2013 - Windowx XP(v120_xp)
【C++】VS2013下CURL编译及使用示例_ssl

无法打开包括文件: “openssl/ssl.h”

错误 1 error C1083: 无法打开包括文件: “openssl/ssl.h”: No such file or directory F:\VS\PACKET\curl-7.53.0\lib\urldata.h 86 1 libcurl

解决办法:添加openssl头文件路径
【C++】VS2013下CURL编译及使用示例_文件路径_02

无法打开包括文件: “libssh2.h”

错误 1 error C1083: 无法打开包括文件: “libssh2.h”: No such file or directory f:\vs\packet\curl-7.53.0\lib\ssh.h 28 1 libcurl

解决办法:添加libssh2.h头文件路径
【C++】VS2013下CURL编译及使用示例_服务器_03

无法打开输入文件“libeay32.lib”

错误 28 error LNK1181: 无法打开输入文件“libeay32.lib” F:\VS\PACKET\curl-7.53.0\projects\Windows\VC12\lib\LINK libcurl

解决办法:libeay32.lib是openssl的库,添加对应的路径到工程。
【C++】VS2013下CURL编译及使用示例_2d_04

无法打开输入文件“libssh2d.lib”

错误 2 error LNK1181: 无法打开输入文件“libssh2d.lib” F:\VS\PACKET\curl-7.53.0\projects\Windows\VC12\lib\LINK libcurl

解决办法:添加libssh2d.lib路径到工程,同时到项目属性–>配置属性–>链接器–>输入–>附加依赖项里,把libssh2d.lib末尾的d去掉,即改为libssh2.lib。
【C++】VS2013下CURL编译及使用示例_ssl_05

再次编译生成,成功。

最后,到curl-7.53.0\build\Win32\VC12\DLL Debug - DLL OpenSSL - DLL LibSSH2目录下就可以看到有libcurld.dlllibcurld.lib了。

使用CURL

以后想要使用CURL,就在项目工程里导入libcurld.lib,之后到生成的exe程序目录下把libcurld.dlllibssh2.dlllibeay32.dllssleay32.dll拷贝过去,即可成功启动程序。

测试示例

另外附上CURL测试例程



#include "curl/curl.h"
#include <iostream>

using namespace std;

/**
* 一旦curl接收到数据,就会调用此回调函数
* buffer:数据缓冲区指针
* size:调试阶段总是发现为1
* nmemb:(memory block)代表此次接受的内存块的长度
* userp:用户自定义的一个参数
*/
size_t write_data(void* buffer, size_t size, size_t nmemb, void* userp)
{
static int current_index = 0;

cout << "current:" << current_index++;
cout << (char*)buffer;
cout << "---------------" << endl;

int temp = *(int*)userp; // 这里获取用户自定义参数
return nmemb;
}

int curl_test(void)
{
curl_global_init(CURL_GLOBAL_ALL); // 首先全局初始化CURL
CURL* curl = curl_easy_init(); // 初始化CURL句柄

if (NULL == curl)
{
printf("(curl is NULL!\r\n");
return 0;
}

int my_param = 1; // 自定义一个用户参数

// 设置目标URL
curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
// 设置接收到HTTP服务器的数据时调用的回调函数
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
// 设置自定义参数(回调函数的第四个参数)
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &my_param);
// 执行一次URL请求
CURLcode res = curl_easy_perform(curl);
// 清理干净
curl_easy_cleanup(curl);

return 0;
}

int main()
{
curl_test();
return 0;
}

下载

另外我上传了调用CURL的示例工程,下载地址:​​javascript:void(0)​

如果想要博主编译好的dll和lib以及其他依赖包,可以到这里下载
链接: ​​​http://pan.baidu.com/s/1i48QKtR​​ 密码: uvva

补充

后来在把工程打包后在其它机器上运行,会出现缺失MSVCP120D.dll或MSVCR120D.dll等等警告导致运行不了。查了多方资料后,首先上微软官网下载对应的Visual Studio C++组件包( Redistributable Packages)。

Visual C++ Redistributable Packages 安装运行时组件,这些组件是在未安装 Visual Studio 2013 的计算机上运行使用 Visual Studio 2013 开发的应用程序所必需的。

但是这样还是没有解决上面的问题。这是因为微软的Visual Studio最终用户许可协议是禁止发布调试版(名字后面有D)的DLL的。我们前面编译的dll其实是Debug版本,所以我们需要编译Release版本的dll。选择如下:到「菜单栏」–>「生成」–>「配置管理器」那里进行配置选择。
【C++】VS2013下CURL编译及使用示例_服务器_06
从图片可以看出还有很多其他选项,也有不带OpenSSL和SSH2的。如果有需要请自行摸索。

另外,百度网盘的资源已经更新,添加了发布版本的curl库。


文章最后编辑时间:2017年3月6日



概述

VS C++下可以使用CURL工具进行网络通信,但是要用到CURL必须有dll和lib文件。所以这个要自己编译生成这些文件。

编译环境及版本

  • Windows 10 x64
  • VS 2013
  • curl 7.53.0
  • libssh2-1.8.0
  • openssl-1.0.2k

下载

首先去​​CURL官网​​下载最新版本。目前最新版本是curl 7.53.0。

同时到​​http://windows.php.net/downloads/php-sdk/deps/vc11/x86/​​这里下载编译好的其他工具,这样就不需要在编译这些工具了。主要下载这几个:libssh2、openssl、zlib(zlib可能用不上)。另外下载还需要注意是下载32位的还是64位的。编译64位的libcurl不能使用32位的扩展包。

解压并打开工程

解压curl后到目录curl-7.53.0\projects\Windows下选择一个本地有对应版本的VC工程打开,我用的是VS2013,我选择最近的VC12工程就行了。

打开curl-all.sln后可以在解决方案看到有两个项目
curllibcurl,我要生成curl的库文件自己使用,就选择libcurl项目进行生成。

编译CURL库

下面开始解决编译错误

无法打开包括文件: “winsock2.h”

错误 1 error C1083: 无法打开包括文件: “winsock2.h”: No such file or directory F:\VS\PACKET\curl-7.53.0\lib\curl_setup.h 256 1 libcurl

解决方法:项目属性–>配置属性–>常规–>平台工具集–>选择VS2013 - Windowx XP(v120_xp)
【C++】VS2013下CURL编译及使用示例_ssl

无法打开包括文件: “openssl/ssl.h”

错误 1 error C1083: 无法打开包括文件: “openssl/ssl.h”: No such file or directory F:\VS\PACKET\curl-7.53.0\lib\urldata.h 86 1 libcurl

解决办法:添加openssl头文件路径
【C++】VS2013下CURL编译及使用示例_文件路径_02

无法打开包括文件: “libssh2.h”

错误 1 error C1083: 无法打开包括文件: “libssh2.h”: No such file or directory f:\vs\packet\curl-7.53.0\lib\ssh.h 28 1 libcurl

解决办法:添加libssh2.h头文件路径
【C++】VS2013下CURL编译及使用示例_服务器_03

无法打开输入文件“libeay32.lib”

错误 28 error LNK1181: 无法打开输入文件“libeay32.lib” F:\VS\PACKET\curl-7.53.0\projects\Windows\VC12\lib\LINK libcurl

解决办法:libeay32.lib是openssl的库,添加对应的路径到工程。
【C++】VS2013下CURL编译及使用示例_2d_04

无法打开输入文件“libssh2d.lib”

错误 2 error LNK1181: 无法打开输入文件“libssh2d.lib” F:\VS\PACKET\curl-7.53.0\projects\Windows\VC12\lib\LINK libcurl

解决办法:添加libssh2d.lib路径到工程,同时到项目属性–>配置属性–>链接器–>输入–>附加依赖项里,把libssh2d.lib末尾的d去掉,即改为libssh2.lib。
【C++】VS2013下CURL编译及使用示例_ssl_05

再次编译生成,成功。

最后,到curl-7.53.0\build\Win32\VC12\DLL Debug - DLL OpenSSL - DLL LibSSH2目录下就可以看到有libcurld.dlllibcurld.lib了。

使用CURL

以后想要使用CURL,就在项目工程里导入libcurld.lib,之后到生成的exe程序目录下把libcurld.dlllibssh2.dlllibeay32.dllssleay32.dll拷贝过去,即可成功启动程序。

测试示例

另外附上CURL测试例程