終於弄懂了libcurl庫的編譯,記下來免得忘記。
下載地址:
libcurl庫:
http://curl.haxx.se/latest.cgi?curl=zip
openssl安裝包:
http://slproweb.com/products/Win32OpenSSL.html
注:這個在安裝后,在安裝目錄下就有對應的 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復制進去(注意不要丟了";")
注意,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; }