【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 源代碼。下載方式:

筆者這里選擇官網下載,下載最新版本為 curl-7.76.1,我是 Windows 平台,所以選 zip 文件。

C___libcurl_A.png


下面介紹 3 種編譯方法:

筆者原先使用 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 中選擇 /MDdConfigurations: 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開發環境



免責聲明!

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



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