libcurl库的编译

终于弄懂了libcurl库的编译,记下来免得忘记。

下载地址:

 
 
    注:这个在安装后,在安装目录下就有对应的  dll、include文件 和 lib 文件
    添加openssl库是为了添加 libcurl库 对 https 协议的支持
 
 
编译过程:
1、选择编译版本
    编译不同版本的libcurl需要添加不同的库支持。
    
    解压libcurl的压缩包后,进入  projects\Windows\VC10\lib 目录。打开 libcurl.sln      //你的vc版本号
  技术分享  
 技术分享
 
    添加openssl支持,选择 "DLL Debug - DLL OpenSSL" 版本
 
2、添加openssl目录
    下载安装openssl目录
    2.1、创建libcurl库依赖的openssl目录,并拷贝头文件
 
    查看项目的属性
技术分享
 技术分享
    注意到:
技术分享
 技术分享
 
也就是说,我们需要把openssl目录下的Include/openssl文件夹 整个复制到 curl压缩包的解压目录的同级目录中。
 技术分享技术分享
技术分享技术分享
 
 
至于为什么要整个openssl文件夹拷贝过去,而不是把里面的文件拷贝过去,你可以先编译一次,注意一下提示的文件结构。
技术分享
 
    2.2、在openssl/lib 中 找到 libeay32.lib 和 ssleay32.lib文件 ,拷贝到 projects\Windows\VC10\lib 目录下
 
    至于为什么需要这两个文件,查看 属性/链接器/输入/附件依赖项/ ,前面两个系统自带的,后面的是我们要添加的。
技术分享
 技术分享
 3、编译并使用。
    3.1、直接编译就可以得到我们需要的 libcurld.lib 和 libcurld.dll
            在 \build\Win32\VC10 路径下可以找到对应版本编译出来的库。
    3.2、使用 libcurl库 
        3.2.1、给工程添加依赖的库:项目->属性->链接器->输入->附加依赖项,把libcurl.lib ws2_32.lib winmm.lib wldap32.lib添加进去
注意,debug配置用libcurld.lib
        3.2.2、加入预编译选项:项目->属性->c/c++ ->预处理器->预处理器,把  ;BUILDING_LIBCURL;HTTP_ONLY复制进去(注意不要丢了";")
        3.2.3、libeay32.lib 和 ssleay32.lib 、libcurld.lib 拷贝到 工程.sln 所在目录
        3.2.4、libeay32.dll 和 ssleay32.dll 、libcurld.dll 拷贝到运行目录
 
    
 测试代码:
#include<iostream>
#include<string>
#include"curl/curl.h"
using namespace std;

class CurlAutoRelease
{
public:
    CurlAutoRelease(){    p = curl_easy_init();}
    ~CurlAutoRelease(){    curl_easy_cleanup(p);}
    CURL *GetPtr(){    return p;}
protected:
    CURL* p;
};

UINT CurlWriteBuffer(char *buffer,UINT size,UINT nmemb,std::string* stream)
{
    UINT sizes = size*nmemb;
    if(stream == NULL) return 0;
    stream->append(buffer,sizes);
    return sizes;
}

int main()
{
    curl_global_init(CURL_GLOBAL_DEFAULT); 
    
    std::string szUrl("www.baidu.com");
    std::string szContent("");

    try
    {
        CurlAutoRelease curlAutoRelease;
        CURL* curl = curlAutoRelease.GetPtr();
        CURLcode res;

        std::string strResult;
        {
            curl_easy_setopt(curl,CURLOPT_URL,szUrl.c_str());
            curl_easy_setopt(curl,CURLOPT_VERBOSE,1);                                //打开调试
            curl_easy_setopt(curl,CURLOPT_POSTFIELDS,szContent.c_str());            //post请求    
            curl_easy_setopt(curl,CURLOPT_POSTFIELDSIZE,szContent.length());
            curl_easy_setopt(curl,CURLOPT_WRITEFUNCTION,CurlWriteBuffer);            //写回调
            curl_easy_setopt(curl,CURLOPT_WRITEDATA,&strResult);                    //写存储
            curl_easy_setopt(curl,CURLOPT_TIMEOUT,10);                                //最长执行时间

            res = curl_easy_perform(curl);
        }

        if(res != CURLE_OK)
        {
            //投递Http requeset 失败
            std::cout<<"投递Http请求失败!"<<std::endl;
            return -1;
        }
        else
        {
            std::cout<<strResult<<std::endl;
        }
    }
    catch (...)
    {
        //出Exception
        std::cout<<"HttpRqWorker::HandleTask出现了Exception!!"<<std::endl;
    }


    curl_global_cleanup();
    return 0;
}

 

    
 
 
 
 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。