我无法弄清楚如何在我的Code :: Blocks IDE中正确添加静态libcurl库。我希望它是静态的,因为在我的程序运行期间不需要默认情况下不包含在Windows中的.dll文件。我正在使用这个libcurl: http://curl.haxx.se/dlwiz/?type=lib&os=Win32&flav=-(没有OpenSSL的minGW)
以下是我的全局编译器设置:http://img845.imageshack.us/img845/1381/halpr.jpg
我收到以下错误:
ld.exe ||找不到-lCURL_STATICLIB | || ===构建完成:1个错误,0个警告=== |
编译此代码时:
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
我厌倦了与此斗争,请帮助我。
编辑:
Hello Victor,谢谢你的回复!
我会尽量做到尽可能详细,所以没有任何误解。 所以,这是我的C:\ libs \文件夹的目录/文件夹树的图像:
http://img199.imageshack.us/img199/6977/curl1.png
如您所见,它还包括构建日志,您会注意到这次出现的错误 与我之前发布的不同。这是因为我更改了全局编译器并构建了项目设置。
我的新Build Project设置:http://img863.imageshack.us/img863/4404/buildoptions.png 我新的全局编译器设置:http://img225.imageshack.us/img225/4926/curl2.png
我确信我已将这些设置配置错误,这就是我无法编译它的原因。
答案 0 :(得分:21)
好的,我设法使用静态链接使用libcurl成功构建了您的示例。使这项工作所涉及的细节非常复杂 - 正确设置它可能会让那些粗心大意变得棘手。
以下是我用来完成这项工作的步骤,请务必仔细遵循:
转到项目构建选项 - &gt;编译器设置 - &gt; #defines :输入CURL_STATICLIB
。当定义它时,libcurl.h头文件将对其函数签名进行预处理以适应静态链接。否则,假定动态链接,然后变形的名称变为_imp__*
。屏幕截图中未解决的错误表明它正在尝试动态链接而不是所需的静态链接
在项目构建选项 - &gt;链接器设置 - >链接库下,确保它包含以下内容: curl,rtmp,idn,ssl,ssh2,crypto,z ,ws2_32,wldap32,winmm,gdi32 。请注意,订单很重要。由于gnu链接器的设计缺陷,需要首先列出最依赖的库,然后是最少依赖的库。其他链接器如msvc link和borland的ilinker不会出现这样的问题 - 库可以按任何顺序列出。
在项目构建选项 - &gt;链接器设置 - &gt;其他链接器选项中添加'-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程序。 (例如文件 - &gt;新 - &gt;项目 - &gt;用户模板)
希望这能一劳永逸地解决您对libcurl的任何构建问题。