2011-06-05 153 views
8

我無法弄清楚如何正確添加靜態libcurl庫到我的Code :: Blocks IDE。我希望它是靜態的,因爲在我的程序運行時,不需要默認包含在Windows中的任何.dll文件。我用這libcurl的: http://curl.haxx.se/dlwiz/?type=lib&os=Win32&flav=-(MinGW的沒有OpenSSL的)將靜態libcurl添加到Code :: Blocks IDE

這裏是我的全局編譯器設置:http://img845.imageshack.us/img845/1381/halpr.jpg

我收到以下錯誤:

ld.exe||cannot find -lCURL_STATICLIB| ||=== Build finished: 1 errors, 0 warnings ===|

編譯此代碼時

include <stdio.h> 
include <curl/curl.h> 

int main(void) 
{ 
CURL *curl; 
CURLcode res; 

curl = curl_easy_init(); 
if(curl) { 
curl_easy_setopt(curl, CURLOPT_URL, "http://google.com"); 
res = curl_easy_perform(curl); 

/* always cleanup */ 
curl_easy_cleanup(curl); 
} 
return 0; 
} 

顯然它沒有找到CURL_STATICLIB,我不知道爲什麼。我甚至不確定是否需要將CURL_STATICLIB添加到鏈接器設置中(我在其他論壇上閱讀過)。我發現有同樣的問題,一些人,但它沒有正確回答上的任何地方:

stackoverflow.com/questions/4176503/frustrated-with-libcurl

forums.codeblocks.org/index.php?topic=11391.0

old.nabble.com/gcc-working-with-libcurl-td20506927.html

forums.devshed.com/c-programming-42/linker-error-using-libcurl-698071.html

我太累了這種戰鬥的,請幫助我。

編輯:

你好維克托,謝謝你的迴應!

我會盡量詳細,所以沒有任何的誤解。 所以,這裏是我的C目錄/文件夾樹的形象:\庫\文件夾:

http://img199.imageshack.us/img199/6977/curl1.png

正如你所看到的,它也包括了構建日誌,你會發現錯誤此時是 不同於我以前發佈的。這是因爲我更改了全局編譯器並構建了項目設置。

我的新生成項目的設置:http://img863.imageshack.us/img863/4404/buildoptions.png 我的新的全球編譯器設置:http://img225.imageshack.us/img225/4926/curl2.png

我相信我已經配置這些設置錯了,這就是爲什麼我不能編譯。

+1

只是爲了得到更多的信息,你還可以提供什麼樣的實際命令行調用?您可以通過在其他設置選項卡下並從下拉列表中選擇完整命令行來完成此操作。你還可以提供lib/curl-7.x.x */lib目錄下的文件列表嗎? – greatwolf 2011-06-08 00:24:16

+0

你是如何「安裝」libcurl文件的?你剛創建一個新目錄並複製lib和include文件夾,然後告訴codeblocks看看嗎?我正在努力自己解決這個問題。謝謝! :) – llk 2011-06-28 00:14:25

回答

20

好吧,我設法用libcurl使用靜態鏈接成功地構建了您的示例。使這項工作所涉及的細節非常複雜 - 正確設置它可能會讓粗心大意變得棘手。

下面是我用來做這項工作的步驟,一定要認真遵循他們:

  1. 轉到項目構建選項 - >編譯器設置 - >#定義:類型CURL_STATICLIB。當定義這個時,libcurl.h頭文件將對其函數簽名進行預處理以適合靜態鏈接。否則,假定動態鏈接,並且損壞的名稱將變爲_imp__*。截圖中未解決的錯誤表明它正在嘗試動態鏈接而不是所需的靜態鏈接。

  2. 項目建立選項 - >鏈接設置 - >鏈接庫確保它包含以下內容:捲曲,RTMP,印度尼西亞,SSL,SSH2,加密,Z,WS2_32,WLDAP32,WINMM, gdi32。請注意,訂單很重要。由於gnu鏈接器的設計缺陷,最依賴的庫需要首先列出,然後是最不依賴的庫。其他連接器如msvc link和borland的ilinker不會出現這樣的問題 - 庫可以按任何順序列出。

  3. Under 項目構建選項 - >鏈接器設置 - >其他鏈接器選項添加'-static'。這將確保使用靜態版本的'idn'。如果這個開關被忽略,那麼你的編譯程序可能依賴'libidn-11.dll'來運行,這可能不是你想要的。

在這一點上,你應該能夠編譯和鏈接的libcurl程序沒有任何問題。值得一提的有兩件事情,

  • 其他連接選項不需要從你的截圖其他額外的交換機。 'libcurl.a'已經列出並覆蓋鏈接庫

  • 'libcrypto.a'似乎覆蓋了與'libeay32.a'相同的引用,因此只需要其中的一個。然而,'libeay32.a'儘管規模較大,但仍會產生動態聯繫。如果您希望自己的應用程序「完全獨立」,請使用「libcrypto.a」而不是像截圖一樣。

  • 如果你想在未來的動態鏈接,只需更換下鏈接庫與「curldll」上市並刪除CURL_STATICLIB定義。由於libcurl.dll已經覆蓋它們,因此不需要額外的庫(例如.ssl,idn,rtmp等)。

  • 您可以通過使用代碼塊的用戶模板來避免新的libcurl程序的單調乏味的錯誤設置。 (如:文件 - >新建 - >項目 - >用戶模板

希望這可以解決你有libcurl的一勞永逸任何的構建問題。

+0

感謝您的詳細描述和提示!它現在對我來說是靜態和動態地構建它的!只有一個,最後一個問題:你怎麼知道要添加什麼以及在哪裏?您從哪裏獲取信息的來源是什麼?我也想知道這一點,所以我不必每次都要將新庫添加到我的IDE時發送垃圾郵件。再一次,謝謝你! :) – Javatar 2011-06-09 12:15:42

+0

@newbie來自您的問題的鏈接提供了一個很好的起點,但很多來自使用工具和反覆試驗的經驗。Mingw與'nm'和'objdump'打包在一起非常有幫助 - 它們允許您檢查相關庫文件中的內容(其他編譯器有自己的'objdump'版本)。將它與'grep'(Windows下的'findstr')結合起來,你就可以找到特定函數或數據片段所在的位置(或者它是否存在於第一個位置)。檢查libcurl.h也提供了有用的線索。當然,還有老式的MSDN。 – greatwolf 2011-06-09 21:42:16

+0

由於法律原因(DMCA),rtmp庫是不相關的,長話短說,它可以靜態鏈接libcurl,它不會處理rtmp:// urls。我自己並不需要,也不需要idn庫,所以我最終刪除了它們,並且它工作。對Cygwin背後的這些圖書館進行黑客攻擊的人很感謝,並對你提供了關於如何做到這一點的詳細解釋。 – Holdsworth 2017-06-02 23:42:44