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;
}

 

    
 
 
 
 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM