【问题标题】:Adding static libcurl to Code::Blocks IDE将静态 libcurl 添加到 Code::Blocks IDE
【发布时间】:2011-06-05 14:52:17
【问题描述】:

我不知道如何正确地将静态 libcurl 库添加到我的 Code::Blocks IDE。我希望它是静态的,因为在我的程序运行期间不需要默认不包含在 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

我已经厌倦了与这个斗争,请帮助我。

编辑:

你好维克多,谢谢你的回复!

我会尽量详细,以免有误会。 所以,这是我的 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

我确定我这些设置配置错了,所以我无法编译它。

【问题讨论】:

  • 只是为了获得更多信息,您能否提供实际调用的命令行的样子?您可以通过在“其他设置”选项卡下并从下拉菜单中选择“完整命令行”来执行此操作。您能否提供一个存在于您的 lib/curl-7.x.x*/lib 目录下的文件列表?
  • 您是如何“安装”libcurl 文件的?您是否只是创建了一个新目录并在那里复制了 lib 和包含文件夹,然后告诉代码块到那里查看?我正在尝试自己解决问题。谢谢! :)

标签: c++ static libcurl codeblocks


【解决方案1】:

好的,我成功地使用 libcurl 使用静态链接构建了您的示例。完成这项工作所涉及的细节非常复杂——正确设置它可能会让粗心的人变得棘手。

这是我用来完成这项工作的步骤,请务必仔细遵循:

  1. 转到项目构建选项->编译器设置->#defines:输入CURL_STATICLIB。定义后,libcurl.h 标头将对其函数签名进行预处理以适应静态链接。否则假定为动态链接,然后损坏的名称变为_imp__*。您的屏幕截图中未解决的错误表明它正在尝试动态链接而不是所需的静态链接。

  2. Project build options->Linker settings->Link library 下确保它包含以下内容:curl、rtmp、idn、ssl、ssh2、crypto、z、ws2_32 , wldap32, winmm, gdi32。请注意,顺序很重要。由于 gnu 链接器的设计缺陷,需要首先列出最依赖的库,然后是最不依赖的库。其他链接器(如 msvc 链接和 borland 的 ilinker)不会出现此类问题——这些库可以按任何顺序列出。

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

此时,您应该能够毫无问题地编译和链接 libcurl 程序。有几件事值得一提,

  • Other linker options 下不需要屏幕截图中的其他额外开关。 链接库已经列出并涵盖了“libcurl.a”。

  • “libcrypto.a”似乎涵盖了与“libeay32.a”相同的引用,因此只需要其中一个。然而,“libeay32.a”尽管尺寸较大,但仍会导致动态链接。如果您希望您的应用程序“完全独立”,请使用“libcrypto.a”,而不是像屏幕截图中那样。

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

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

希望这可以一劳永逸地解决您在使用 libcurl 时遇到的任何构建问题。

【讨论】:

  • 感谢您的详细描述和提示!我现在可以静态和动态地构建它!只有一个,最后一个问题:你怎么知道必须添加什么以及在哪里添加?你从哪里获取信息的来源是什么?我也想学习这一点,所以每次我想向我的 IDE 添加新库时,我都不必向 stackoverflow 发送垃圾邮件。再次感谢您! :)
  • @newbie 您问题中的链接提供了一个很好的起点,但很多都是来自使用工具和反复试验的经验。 Mingw 与 'nm' 和 'objdump' 一起打包非常有用——它们允许您准确检查有问题的库文件中的内容(其他编译器有自己的 'objdump' 版本)。将此与“grep”(Windows 下的“findstr”也可以)结合使用,您可以定位特定函数或数据块所在的位置(或者它是否首先存在)。检查 libcurl.h 也提供了有用的线索。当然,还有古老的 MSDN。
  • rtmp 库由于法律原因(DMCA)无关紧要,长话短说,可以静态链接 libcurl,它只是无法处理 rtmp:// url。我自己不需要那个,也不需要 idn 库,所以我最终删除了这两个库并且它起作用了。非常感谢那些在 Cygwin 背后破解这些库的人,感谢您提供有关如何做到这一点的详细说明。
猜你喜欢
  • 1970-01-01
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-31
相关资源
最近更新 更多