我正在使用Microsoft Visual C ++ 2010,我需要创建一个不需要libcurl dll的应用程序。我在预处理器指令中定义CURL_STATICLIB并链接到libcurl.lib,libcurl_static.lib,ws2_32.lib和winmm.lib,但它仍然需要dll才能工作。如果我只链接到libcurl_static.lib,它有未定义的外部符号错误。我怎样才能让它发挥作用?
我也尝试构建源代码,但我得到了13个错误(哇,不幸的数字),都说“错误C2011:'pollfd':'struct'类型重定义”。有人可以帮我让libcurl工作吗?
答案 0 :(得分:12)
没有简单的答案:) 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 :(得分:1)
我通过在libcurl项目和我的应用程序的预处理器指令中指定HTTP_ONLY和CURL_STATICLIB来获得libcurl的静态构建以进行编译和链接。这消除了您可能不需要的协议所需的所有依赖关系。该应用程序现在无需任何DLL即可运行。
除此之外,我只需要确保libcurl.lib和curl包含文件的路径是在应用程序的visual studio项目设置中设置的。
我使用过的参考资料:
在Win32版本中禁用特定协议: http://curl.haxx.se/mail/lib-2011-12/0123.html
在Visual Studio中使用libcurl(已过时): http://curl.haxx.se/libcurl/c/visual_studio.pdf