2010-08-05 95 views
8

我正在使用Microsoft Visual C++ 2010,而且我需要製作一個不需要libcurl dll的應用程序。我在預處理器指令中定義了CURL_STATICLIB,並鏈接到了libcurl.lib,libcurl_static.lib,ws2_32.lib和winmm.lib,但它仍需要dll才能工作。如果我只鏈接到libcurl_static.lib,它有未定義的外部符號錯誤。我怎樣才能使它工作?使用libcurl而不使用dll

我也嘗試過構建源代碼,但是我得到了13個錯誤(哇,不幸的數字),都說「error C2011:'pollfd':'struct'type redefinition」。有人能幫我讓libcurl工作嗎?

回答

11

沒有簡單的答案:) Libcurl依賴於其他第三方庫(它取決於您使用的二進制分發)。當你擺脫DLL時,你必須手動鏈接相應的第三方。

好吧,所以第一點是你不應該鏈接到libcurl.lib,因爲它將你綁定到你不想要的DLL。第二點 - 當你連接libcurl_static.lib然後(如上所述),你也必須鏈接它依賴的庫。簡單的方法是做這樣的事情:

#if defined CURL_STATICLIB 

#if defined _DEBUG 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Debug\\curllib_static.lib") 
#else 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\lib\\Release\\curllib_static.lib") 
#endif 

#pragma comment(lib, "ws2_32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\libeay32.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\openldap.lib") 
#pragma comment(lib, "libcurl-7.19.3-win32-ssl-msvc\\ssleay32.lib") 

#endif 

但是這樣 - 你會得到三個更多的依賴關係。或者,您可以搜索一種靜態鏈接方式,但它是一個不同的故事。

作爲另一種選擇 - 你可以從源禁用所有你不需要從而消除不必要的依賴關係的特徵後重建libcurl_static.lib(如「禁用特定的協議在Win32中建立」的INSTALL文件) 。

最後一點 - 由於libcurl對來自源代碼的Windows編譯的支持很差,我建議您重新考慮擺脫curllib.dll的想法。

1

通過在libcurl項目和我的應用程序的預處理器指令中同時指定HTTP_ONLY和CURL_STATICLIB,我得到了libcurl的靜態構建以進行編譯和鏈接。這消除了您可能不需要的協議所需的所有依賴關係。該應用程序現在不需要任何DLL。

除了上述,我只需要確保libcurl.lib和捲曲包含文件的路徑在應用程序的visual studio項目設置中設置。

參考文獻I中:

在Win32中禁用特定的協議建立: http://curl.haxx.se/mail/lib-2011-12/0123.html

在Visual Studio中使用的libcurl(過時): http://curl.haxx.se/libcurl/c/visual_studio.pdf