自己編譯的curl庫

2021-08-24 17:58:14 字數 3365 閱讀 9601

預設curl是不支援ssl的,需要自己勾選,並配置對應ssl**。

一般編譯都需要支援ssl,大多選擇openssl開源庫。

可自行編譯。編譯的時候,最好勾選testing選項,來編譯測試檔案,這樣編譯研究各種測試用例。

勾選cmake中的enable_threaded_resolver選項 。

並且注釋掉**中的

//curl_easy_setopt(curl, curlopt_connecttimeout, 30);

//curl_easy_setopt(curl, curlopt_timeout, 30);

release版本不再崩潰。

參考:curl-get.h

#pragma once

#include

bool curl_get_req

(const std:

:string &url, std:

:string &sbody, std:

:string &sheader)

;bool curl_get_req2

(const std:

:string &url, std:

:string &sheader, std:

:string &sbody)

;

curl-get.cpp

#include

#include

#include

"curl/curl.h"

using namespace std;

#pragma comment(lib, "ws2_32.lib")

#pragma comment(lib, "wldap32.lib")

#pragma comment(lib, "libcurl.lib")

// win32 ndebug

// //

//libcurl 不支援非同步 dns 解析時,會通過 signal 的方式實現 dns 解析設定超時,

//signal 會導致多執行緒程式崩潰,後台服務通常都是多執行緒的,

//所以應該總是設定這個選項(但是 libcurl 不支援非同步 dns 解析時,超時選項將被忽略)。

//可以通過執行 curl --version 命令或呼叫 curl_version 函式檢視 libcurl 是否支援非同步 dns 解析,

//呼叫 curl_version_info 函式還可以獲得具體的 c - ares 庫版本號。

//編譯 libcurl 時,通過為 configure 指定 --enable - threaded - resolver 或 --enable - ares 選項啟用非同步 dns 解析。

// size_t req_reply

(void

*ptr, size_t size, size_t nmemb,

void

*stream)

// 用這個函式會的 release 版本會導致程序退出

bool curl_get_req

(const std:

:string &url, std:

:string &sheader, std:

:string &sbody)

curl_easy_cleanup

(curl)

;return true;

}// 這種模式debug/release都正常

bool curl_get_req2

(const std:

:string &url, std:

:string &sheader, std:

:string &sbody)

; using curl = unique_ptr

decltype

(curl_deleter)

>

; curl curl

; curlcode res;

if(curl)

return true;

}

##03 debug正常/release失敗,不是這個庫的問題

chromium 載入自己的dll,需要注意dll呼叫要符合windows api規範。

debug版本沒有嚴格按照windows api規範,所以debug版本呼叫正常。

release版本則必須嚴格按照win api標準,尤其是記憶體分配。

比如:你不可以用std::string ¶ms 作為dll的回參引數。而需要使用比如 char *params這種型別的,在dll函式外表分配記憶體的形式。(如果動態分配記憶體,必須自己嚴格釋放)

另外,com 介面的使用也必須注意。

##04 遇到靜態鏈結錯誤

如果是

__imp_curl_easy_init

__imp_curl_easy_setopt

__imp_curl_easy_perform

型別的鏈結錯誤,應該是沒有加入預編譯項:curl_staticlib如果出現

__imp_write

__imp_read

__imp_access

型別錯誤,應該是libcurl編譯的時候,沒有勾選curl_static_crt

注意編譯時zlib庫需要使用動態載入vs dll的那種。否則會有vs庫引入衝突。

如果引入 zlibstatic.lib和zlibstaticd.lib,會有vs 庫的衝突。如下:

138>msvcrt.lib(_chandler4gs_.obj) : error lnk2019: 無法解析的外部符號 __except_handler4_common,該符號在函式 __except_handler4 中被引用

138>d:\git\curl\build\vs2017\x86\tests\libtest\release\lib650.exe : fatal error lnk1120: 1 個無法解析的外部命令

deepin編譯curl靜態庫

1 linux 編譯libcurl靜態庫 第二步,解壓原始碼包,tar zxvf curl 7.29.0.tar.gz 第三部,進入原始碼包,cd curl 7.29.0 第四部,配置編譯引數,configure prefix usr local curl disable shared enable...

QT編譯使用Curl開源庫

3.c program files x86 microsoft visual studio 12.0 vc bin vcvars32.bat 設定 vs 的環境變數,只會當前 cmd 生效 4.nmake f makefile.vc mode dll vc 12 進行編譯動態編譯 5.匯入qt,將 ...

windows 下 curl動態庫編譯

2 在curl master同級目錄下新建deps資料夾,3 把openssl的庫檔案放在deps資料夾下 需要支援zlib的把zlib庫也放在deps資料夾下。沒有openssl可以自己用vcpkg編譯一下。4 接下來編譯64位的curl庫 開啟vs的命令列,順序執行以下命令 5 來編譯32位的c...