赞
踩
VS C++下可以使用CURL工具进行网络通信,但是要用到CURL必须有dll和lib文件。所以这个要自己编译生成这些文件。
首先去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后可以在解决方案看到有两个项目
curl和libcurl,我要生成curl的库文件自己使用,就选择libcurl项目进行生成。
下面开始解决编译错误
错误 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)
错误 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头文件路径
错误 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头文件路径
错误 28 error LNK1181: 无法打开输入文件“libeay32.lib” F:\VS\PACKET\curl-7.53.0\projects\Windows\VC12\lib\LINK libcurl
解决办法:libeay32.lib是openssl的库,添加对应的路径到工程。
错误 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。
再次编译生成,成功。
最后,到curl-7.53.0\build\Win32\VC12\DLL Debug - DLL OpenSSL - DLL LibSSH2目录下就可以看到有libcurld.dll和libcurld.lib了。
以后想要使用CURL,就在项目工程里导入libcurld.lib,之后到生成的exe程序目录下把libcurld.dll、libssh2.dll、libeay32.dll、ssleay32.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的示例工程,下载地址:http://download.csdn.net/detail/u012163234/9763393
如果想要博主编译好的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。选择如下:到「菜单栏」–>「生成」–>「配置管理器」那里进行配置选择。
从图片可以看出还有很多其他选项,也有不带OpenSSL和SSH2的。如果有需要请自行摸索。
另外,百度网盘的资源已经更新,添加了发布版本的curl库。
文章最后编辑时间:2017年3月6日
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。