2010-08-05 111 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