C++ 向Code::Blocks IDE添加静态libcurl

C++ 向Code::Blocks IDE添加静态libcurl,c++,static,libcurl,codeblocks,C++,Static,Libcurl,Codeblocks,我不知道如何正确地将静态libcurl库添加到我的Code::Blocks IDE中。我希望它是静态的,因为在我的程序运行时不需要.dll文件,默认情况下Windows不包含这些文件。我正在使用这个libcurl: (不带OpenSSL的minGW) 以下是我的全局编译器设置: 我得到以下错误: ld.exe | |找不到-lCURL|u STATICLIB | | |=生成完成:1个错误,0个警告===| 编译此代码时: include <stdio.h> include <

我不知道如何正确地将静态libcurl库添加到我的Code::Blocks IDE中。我希望它是静态的,因为在我的程序运行时不需要.dll文件,默认情况下Windows不包含这些文件。我正在使用这个libcurl: (不带OpenSSL的minGW)

以下是我的全局编译器设置:

我得到以下错误:

ld.exe | |找不到-lCURL|u 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=curl_easy_init();
if(curl){
curl\u easy\u setopt(curl,CURLOPT\u URL,“http://google.com");
res=旋度(curl)\u容易执行(curl);
/*总是清理*/
旋度\轻松\清洁(旋度);
}
返回0;
}
显然它没有找到CURL_STATICLIB,所以我不知道为什么。我甚至不确定是否需要将CURL_STATICLIB添加到我的链接器设置中(我在其他论坛上读过)。我发现有些人也有同样的问题,但在任何地方都没有得到正确的回答:

stackoverflow.com/questions/4176503/failured-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\folder的目录/文件夹树的图像:

如您所见,它还包括构建日志,您将注意到这次的错误是 与我之前发布的不同。这是因为我更改了全局编译器和构建项目设置

我的新生成项目设置: 我的新全局编译器设置:


我确信我配置的这些设置是错误的,这就是我无法编译它的原因。

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

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

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

  • 在项目构建选项->链接器设置->链接库下,确保它包含以下内容:curl、rtmp、idn、ssl、ssh2、crypto、z、ws2_32、wldap32、winmm、gdi32。请注意,顺序很重要。由于gnu链接器的设计缺陷,需要首先列出最依赖的库,然后列出最不依赖的库。其他链接器,如msvc链接和borland的iLink,则不会出现此类问题——这些库可以按任何顺序列出

  • 在项目生成选项->链接器设置->其他链接器选项加载项'-static'下。这将确保使用“idn”的静态版本。如果省略此开关,则编译后的程序可能会依赖“libidn-11.dll”运行,这可能不是您想要的。

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

    • 在“其他链接器选项”下,不需要屏幕截图中的其他额外开关libcurl.a'已被链接库列出并涵盖

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

    • 如果您希望将来动态链接,只需将链接库下的列表替换为“curldll”,并删除
      CURL\u STATICLIB
      define。由于libcurl.dll已经包含了额外的库(例如ssl、idn、rtmp等),因此不需要这些库

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


    希望这能一劳永逸地解决您在libcurl中遇到的任何构建问题。

    为了获得更多信息,您还可以提供实际调用的命令行是什么样子的吗?您可以通过在“其他设置”选项卡下并从下拉列表中选择“完整命令行”来完成此操作。您还可以提供lib/curl-7.x.x*/lib目录下存在的文件列表吗?您是如何“安装”libcurl文件的?您是否刚刚创建了一个新目录并复制了lib和文件夹,然后告诉codeblocks查看那里?我正试图自己解决这个问题。谢谢!:)感谢您的详细描述和提示!现在静态和动态地构建它对我来说很有效!最后一个问题是:您如何知道必须添加什么以及在哪里添加?你的信息来源是什么?我也希望了解这一点,这样我就不必在每次向IDE添加新库时都进行垃圾邮件堆栈溢出。再次感谢你!:)@新手:你问题中的链接提供了一个很好的起点,但很多都来自于使用工具的经验和反复试验。Mingw附带了“nm”和“objdump”,它们非常有用——它们允许您准确地检查所讨论的库文件中的内容(其他编译器有自己的“objdump”版本)。将其与“grep”(windows下的“findstr”也可以使用)结合使用,您可以定位特定函数或数据块的驻留位置(或者它是否存在)