一、簡介
libcurl 是一個跨平台的網絡協定庫,支援 http, https, ftp, gopher, telnet, dict, file, 和 ldap 協定。libcurl 同樣支援 HTTPS 證書授權,HTTP POST, HTTP PUT, FTP 上傳, HTTP 基本表單上傳,代理,cookies 和使用者認證。想要知道更多關于 libcurl 的介紹,可以到官網 http://curl.haxx.se/上去了解,在這裡不再詳述。
二、編譯 libcurl
libcurl 沒有提供編譯好的庫,需要自己編譯,先下載下傳 libcurl 源代碼。下載下傳方式:
github 頁面:https://github.com/curl/curl
libcurl 官網:https://curl.haxx.se/download.html
筆者這裡選擇官網下載下傳,下載下傳最新版本為 curl-7.76.1,我是 Windows 平台,是以選 zip 檔案。
下面介紹 3 種編譯方法:
nmake 編譯,想了解 cmake 與 nmake 的差別可以參考:5分鐘了解make/makefile/cmake/nmake CMake 編譯,請參考:libcurl庫源碼編譯,安裝c++ 使用源碼自帶的 .sln 編譯,具體步驟可參考:【C++】VS2013下CURL編譯及使用示例 筆者原先使用 CMake 編譯,最後生成了 libcurl.dll,但即使設定生成靜态庫,也沒有生成 .lib,在網上查找生成 .lib 的方法,需要有連結器中配置,但源碼工程中沒有連結器一項,由于時間原因暫時沒有深入研究下去。
也不推薦源碼自帶的 .sln 編譯方法,因為 libcurl 依賴以下庫(以下庫版本為目前最新版本),還需要下載下傳解壓這些庫,比較麻煩:
libssh2-1.9.0openssl-1.1.1k 推薦使用第一種方式,筆者采用這種方法編譯成功,下面詳細介紹 nmake 編譯方法。
nmake 編譯
(1)下載下傳完成後解壓,并進入檔案夾,運作buildconf.bat。
(2)在開始菜單中找到 Visual Studio 2019 檔案夾,編譯 64 位則右擊 x64 Native Tools Command Prompt for VS 2017/2019,編譯 32 位則右擊 x86 Native Tools Command Prompt for VS 2017/2019,選擇管理者方式運作。
(3)進入 curl 檔案夾中的 winbuild 檔案夾。
(4)2019 + x64 + release + 靜态編譯:
nmake /f Makefile.vc mode=static VC=15 MACHINE=x64 DEBUG=no
- 如需動态編譯,将 mode=static 改為 mode=dll。(本文僅示範靜态編譯,同時 curl 官方也不建議使用動态編譯)
- 如需編譯為 x86,将 MACHINE=x64 改為 MACHINE=x86。
- 如需編譯為debug版,将DEBUG=no改為DEBUG=yes。
- 如果你是 VS2019,VC=15 建議改為 VC=14。
- 更詳細的編譯指令及說明可以打開 winbuild 檔案夾中的 BUILD.WINDOWS.txt 檢視。
(5)回車,等待編譯完成,關閉控制台界面。編譯出的庫路徑為
C:\Users\xianf\Downloads\curl-7.76.1\builds\libcurl-vc15-x64-release-static-ipv6-sspi-schannel。
詳細圖文教程請參考:Visual Studio(VS2017/VS2019)編譯并配置C/C+±libcurl開發環境
nmake 是 Microsoft Visual Studio 中的附帶指令,需要安裝 VS,即 Windows 上的 make。
如果不了解各個 VS 指令提示工具的差別,可以去看:VS 指令提示工具
三、配置工程
(1)建立一個項目。本文選擇建立一個名為 Test 的空項目,修改為 Release + x64 配置;
(2)配置 include 和 lib 路徑,将以下 lib 添加至工程:
libcurl_a.lib
Ws2_32.lib
Wldap32.lib
winmm.lib
Crypt32.lib
Normaliz.lib
(3)屬性 -> 進階 -> 字元集下拉框,使用多位元組字元集;
(4)本文使用了靜态編譯,是以需要将 CURL_STATICLIB 添加至工程;
(5)本文使用了靜态編譯且沒有編譯 debug 版 libcurl,是以直接在 Configurations: All Configurations 中将 Runtime Library 選擇為 /MD。
-
如果編譯了 debug 版 libcurl,請分别在 Configurations: Debug 中選擇
/MDd、Configurations: Release 中選擇 /MD。
- 如果使用了動态編譯,則為 /MTd 和 /MT。
四、測試代碼
#include <curl/curl.h>
int main(int argc, char* argv[]) {
CURL* curl = nullptr;
CURLcode res;
curl = curl_easy_init();
if (curl != nullptr) {
curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
/* example.com is redirected, so we tell libcurl to follow redirection */
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if (res != CURLE_OK) {
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
}
/* always cleanup */
curl_easy_cleanup(curl);
}
return 0;
}