libcurl靜態編譯
『壹』 linux環境下c 怎麼靜態連接到libcurl
gcc 編譯時加參數 -static, 默認是動態鏈接的
『貳』 為什麼編譯好的curl靜態lib用不了
你把它curl.lib引到庫裡面,然後只包含頭文件的上級目錄,原目錄需要是<curl/curl.h>
1 靜態庫路徑設置正確
2 定義CURL_STSTICLIB 解決extern函數聲明問題,否則是動態庫函數名稱
3 增加ws2_32.lib,wldap32.lib 解決tcp通信問題
『叄』 libcurl是什麼語言開發的
libcurl是C語言開發的網路庫,支持多種網路協議.
有很多種不同的方式來編譯C語言代碼。這里使用UNIX平台下的編譯方式。即使你使用的是其他的操作系統,你仍然可以通過閱讀本文檔來獲取許多有用的信息。
編譯
你的編譯器必須知道libcurl頭文件的位置。所以在編譯的時候,你要設置頭文件的包含路徑。可以使用curl-config工具來獲取這方面的信息:
$ curl-config –cflags
鏈接
編譯完源碼(這時的源代碼不是指libcurl的源代碼,你是你自己寫的程序代碼)之後,你還必須把目標文件鏈接成單個可執行文件。你要鏈接libcurl庫,以及libcurl所依賴的其他庫,例如OpenSLL庫。當然可能還需要一些其他的操作系統庫。最後你還要設置一些編譯選項,當然可以使用curl-config工具簡化操作:
$curl-config –libs
是否使用SSL
定製編譯libcurl。與其他庫不同的是,libcurl可以定製編譯,根據實際需要是否支持某些特性,如是否支持SSL傳輸,像HTTPS和FTPS。如果決定需要支持SSL,必須在編譯時正確的設置。可以使用』curl-config』來判斷libcurl庫是否支持SSL:
$ curl-config –feature
『肆』 如何鏈接libcurl
靜態鏈接libcurl的步驟
1、使用跟程序相同的選項編譯libcurl靜態庫;
2、程序中在引入curl頭文件前定義
#define
CURL_STATICLIB
3、引入庫:
#if defined(_DEBUG)
#pragma comment(lib,
"libcurld.lib")
#else
#pragma comment(lib,
"libcurl.lib")
#endif
#pragma comment ( lib, "ws2_32.lib" )
#pragma
comment ( lib, "wldap32.lib" )
『伍』 如何編譯libcurl
1:linux下源碼編譯
./configure --prefix=/usr/local/curl --disable-shared --enable-static --without-libidn --without-ssl --without-librtmp --without-gnutls --without-nss --without-libssh2 --without-zlib --without-winidn --disable-rtsp --disable-ldap --disable-ldaps --disable-ipv6
注意:不需要其它功能就disable,不然會在連接時報錯, 如果你沒有disable掉,但你的機器上又沒有安裝相應的庫,link時會報錯。
2:windows下源碼編譯
libcurl 7.21以後的版本在Windows下的編譯比較簡單,自帶了MinGW和VC環境的Makefile文件,首先去Curl官網下載源代碼:curl.haxx.se/download.html,任選一個下載即可,推薦這個: curl-7.21.2.tar.gz,下載完成後解壓開,打開命令行進入curl源碼目錄,(在此之前請先設置好MinGW的環境變數):
cd curl-7.21.2
編譯libcurl庫文件:
cd lib
make -f Makefile.m32
等待編譯完成即可
(若需編譯生成curl可執行文件,則執行:
cd ../src
make -f Makefile.m32)
編譯完成後,我們需要復制include頭文件和庫文件到一個目錄供程序開發用
1. 新建curllib目錄
2. 新建curllib/include目錄,將源代碼include目錄里的curl文件夾復制到curllib/include目錄,這些是使用libcurl需要的頭文件
3. 新建curllib/lib目錄,將源代碼lib目錄里編譯好的庫文件libcurl.a,libcurldll.a,libcurl.dll復制到curllib目錄
4. 將MinGW安裝目錄下lib文件夾里的libwldap32.a和libws2_32.a復制到curllib/lib目錄
『陸』 為什麼編譯好的libcurl靜態lib用不了
When building an application that uses the static libcurl library, you must
add -DCURL_STATICLIB to your CFLAGS. Otherwise the linker will look for
dynamic import symbols. If you get linker error like "unknown symbol
__imp__curl_easy_init ..." you have linked against the wrong (static)
library. If you want to use the libcurl.dll and import lib, you don't need
any extra CFLAGS, but use one of the import libraries below
在這里:http://curl.haxx.se/docs/faq.html#Link_errors_when_building_libcur
所以我們這樣來改
菜單-->project -->settings-->C++選項卡的General裡面的Project Option裡面加上-DCURL_STATICLIB (其實就相當於在Preprocessor definitions裡面加上CURL_STATICLIB一樣)
確定-->rebuild all
又出錯了:
libcurl.lib(easy.obj) : error LNK2001: unresolved external symbol
libcurl.lib(telnet.obj) : error LNK2001: unresolved external symbol
libcurl.lib(easy.obj) : error LNK2001: unresolved external symbol
.....
這個一看就明白了馬上加上:
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "wldap32.lib" )
編譯-->叮的一個美妙的聲音想起了,哈哈,編譯成功
『柒』 libcurl庫怎麼得到libcurllib.obj
靜態鏈接libcurl的步驟 1、使用跟程序相同的選項編譯libcurl靜態庫; 2、程序中在引入curl頭文件前定義 #define CURL_STATICLIB 3、引入庫: #if defined(_DEBUG) #pragma comment(lib, "libcurld.lib") #else #pragma comment(lib, "libcurl.li...