一、簡介
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 依賴以下庫(以下庫版本為當前最新版本),還需要下載解壓這些庫,比較麻煩:
推薦使用第一種方式,筆者采用這種方法編譯成功,下面詳細介紹 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;
}
參考:
Visual Studio(VS2017/VS2019)編譯並配置C/C++-libcurl開發環境