将静态libcurl添加到Code::Blocks IDE

10
我无法正确地将静态的libcurl库添加到我的Code::Blocks IDE中。我希望它是静态的,因为这样在运行程序时不需要.dll文件,而Windows默认情况下不包含此类文件。 我正在使用此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| ||=== 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:\libs\文件夹的目录树图像:

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
你是如何“安装”libcurl文件的?你是否只是创建一个新目录并将lib和include文件夹复制到那里,然后告诉codeblocks在那里查找?我正在尝试自己解决这个问题。谢谢! :) - llk
1个回答

22

好的,我成功地使用静态链接和libcurl构建了你的示例。为了使这个工作正常,需要处理一些复杂的细节--对于不熟悉的人来说正确设置可能会有些棘手。

以下是我用来使其正常运行的步骤,请务必仔细遵循:

  1. 进入 项目构建选项->编译器设置->#defines:输入 CURL_STATICLIB。当定义此参数时,libcurl.h头文件的函数签名将被预处理以适应静态链接。否则将默认为动态链接,然后名称会变为 _imp__*。你截图中未解决的错误表明它正在尝试进行动态链接而不是所需的静态链接。

  2. 项目构建选项->链接器设置->链接库 中确保它包含以下内容:curl、rtmp、idn、ssl、ssh2、crypto、z、ws2_32、wldap32、winmm、gdi32。注意顺序很重要。由于gnu链接器的设计缺陷,最依赖的库需要放在最前面,后面是最不依赖的库。其他链接器如msvc link和borland的ilinker没有这样的问题--库可以按任意顺序列出。

  3. 项目构建选项->链接器设置->其他链接器选项 中添加 '-static'。这将确保使用静态版本的 'idn'。如果省略此开关,则你编译的程序可能依赖于 'libidn-11.dll' 运行,这可能不是你想要的。

到此为止,你应该能够编译和链接libcurl程序而不会出现任何问题。有几点需要提醒一下:

  • 其他链接器选项 中,你截图中的其他额外开关是不需要的。 'libcurl.a' 已经被列出并且由 链接库 覆盖了。

  • 'libcrypto.a' 看起来涵盖了与 'libeay32.a' 相同的引用,因此只需要其中之一。但是,'libeay32.a' 的尺寸较大,会导致动态链接。如果您希望应用程序“完全自包含”,请使用 'libcrypto.a',如截图所示。

  • 如果将来希望进行动态链接,只需在 链接库 中替换清单为 'curldll' 并删除 CURL_STATICLIB 定义即可。不需要额外的库(例如 ssl、idn、rtmp 等),因为 libcurl.dll 已经涵盖了它们。

  • 您可以通过使用 codeblocks 的用户模板来避免繁琐且容易出错的新 libcurl 程序设置。(例如,文件-> 新建->项目->用户模板)

希望这能彻底解决您与 libcurl 相关的任何构建问题。


感谢您提供详细的描述和提示!现在我已经成功地静态和动态地构建了它!只有一个问题,最后一个问题:您是如何知道需要添加什么以及在哪里添加的?您获取信息的来源是什么?我也想学习这个,这样我就不必每次想要将新库添加到我的IDE时都要在stackoverflow上发帖。再次感谢! :) - Javatar
@newbie,你问题中提供的链接是一个不错的起点,但很多东西都是通过使用工具和试错经验得出的。Mingw自带的'nm'和'objdump'非常有用--它们允许你检查特定库文件中的内容(其他编译器也有自己版本的'objdump')。再结合'grep'(在Windows下也可以使用'findstr'),你可以找到特定函数或数据所在的位置(或者是否存在)。检查libcurl.h也提供了有用的线索。当然,还有老牌的MSDN。 - greatwolf
RTMP库由于法律原因(DMCA)与本文无关。长话短说,可以静态链接libcurl,但它不会处理rtmp:// URLs。我自己不需要这个功能,也不需要IDN库,所以我最终将两者都删除了,并且它工作正常。对于在Cygwin后面黑客这些库的人们以及您提供详细说明的人们,我表示衷心的感谢。 - Holdsworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接