系統升級 libcurl 到 7.19+,動態庫變為 libcurl.so.4,舊程序編譯依賴 libcurl.so.3,啟動報錯:error while loading shared libraries: libcurl.so.3: cannot open shared object file
# 32位系統
cd /usr/lib
ln -s libcurl.so.4 libcurl.so.3
# 64位系統
cd /usr/lib64
ln -s libcurl.so.4 libcurl.so.3
# 驗證
ls -l libcurl.so.3
ldd your_program | grep curl
--with-curl 編譯支持#include "curl/curl.h"
#pragma comment(lib, "libcurl.lib")
long writer(void *data, int size, int nmemb, string &content) {
long sizes = size * nmemb;
content.append((char*)data, sizes);
return sizes;
}
bool CurlInit(CURL *&curl, const char* url, string &content) {
curl = curl_easy_init();
if (!curl) return false;
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, writer);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, &content);
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L); // 調試用
return true;
}
bool GetURLDataBycurl(const char* URL, string &content) {
curl_global_init(CURL_GLOBAL_DEFAULT);
CURL *curl = NULL;
if (!CurlInit(curl, URL, content)) return false;
CURLcode code = curl_easy_perform(curl);
if (code != CURLE_OK) return false;
long http_code = 0;
curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code);
if (http_code != 200) return false;
// 保存文件示例
double length = 0;
curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD, &length);
FILE *fp = fopen("1.gif", "wb");
fwrite(content.c_str(), 1, length, fp);
fclose(fp);
curl_easy_cleanup(curl);
return true;
}
| 選項 | 作用 | 典型值 |
|---|---|---|
| CURLOPT_URL | 請求地址 | 字符串 |
| CURLOPT_WRITEFUNCTION | 數據回調 | 函數指針 |
| CURLOPT_WRITEDATA | 回調用戶數據 | 指針 |
| CURLOPT_FOLLOWLOCATION | 跟隨重定向 | 1 |
| CURLOPT_SSL_VERIFYPEER | 驗證SSL證書 | 0(測試)/1(生產) |
| CURLOPT_POST | 啟用POST | 1 |
| CURLOPT_POSTFIELDS | POST數據 | 字符串/結構體 |
curl_version_info()