天天看點

【C++開源庫】Windows 下編譯 libcurl 庫

一、簡介

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.0​​​​openssl-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;
}