【C++】VS2013下CURL编译及使用示例

概述

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)
这里写图片描述

无法打开包括文件: “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头文件路径
添加openssl头文件路径

无法打开包括文件: “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头文件路径
添加libssh2.h头文件路径

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

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

解决办法:libeay32.lib是openssl的库,添加对应的路径到工程。
添加libeay32.lib路径

无法打开输入文件“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。
改为libssh2.lib

再次编译生成,成功。

最后,到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的示例工程,下载地址: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。选择如下:到「菜单栏」–>「生成」–>「配置管理器」那里进行配置选择。
选择Release
从图片可以看出还有很多其他选项,也有不带OpenSSL和SSH2的。如果有需要请自行摸索。

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


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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值