【问题标题】:Trouble building/compiling libcurl in C++ Application在 C++ 应用程序中构建/编译 libcurl 时遇到问题
【发布时间】:2014-02-19 00:08:44
【问题描述】:

我是 C++ 新手,有兴趣编写一个简单的应用程序来从 Internet 下载 HTTP 文件并处理它的内容)。无论如何,我在网上找到了一个名为 libcurl 的库。我去了以下网站:

http://curl.haxx.se/download.html

  1. 我应该下载源存档还是二进制包(Win64 MinGW64)?使用源存档与二进制 pkg 有什么区别和优缺点?
  2. 由于我正在编写 C++ 应用程序,是否应该使用 curlcpp 绑定?如何将 curlcpp 绑定与此合并?

无论如何,我下载了 curl-7.34.0.zip(源存档),其中包含许多文件夹。我怀疑我需要包含的文件夹是:

  • 包括
  • 源代码

我使用了 CodeBlocks IDE。我“递归地添加”文件夹“include/curl”到我的项目中。它看起来像这样:

我的 main.cpp 包含以下代码(取自网站上的示例应用程序):

#include <iostream>
#include <stdio.h>
#include "curl/curl.h"
using namespace std;

int main()
{
    CURL *curl;
    CURLcode res;

    curl = curl_easy_init();
    if(curl) {
        curl_easy_setopt(curl, CURLOPT_URL, "http://example.com");
        /* example.com is redirected, so we tell libcurl to follow redirection */
        curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

        /* Perform the request, res will get the return code */
        res = curl_easy_perform(curl);

        /* Check for errors */
        if(res != CURLE_OK)
            fprintf(stderr, "curl_easy_perform() failed: %s\n",
              curl_easy_strerror(res));

        /* always cleanup */
        curl_easy_cleanup(curl);

    }
    return 0;
}

我在尝试构建/编译时收到以下错误消息。

undefined reference to '_imp__curl_easy_init'
undefined reference to '_imp__curl_easy_setopt'
undefined reference to '_imp__curl_easy_perform'
undefined reference to '_imp__curl_easy_strerror'
undefined reference to '_imp__curl_easy_cleanup'

我不确定我遗漏了什么,或者我的文件夹目录是否被错误地使用。您有什么建议可以帮助我通过 Source Archive 或 Binary Package 构建它吗?谢谢。

【问题讨论】:

    标签: c++ build compilation compiler-errors libcurl


    【解决方案1】:

    这里有几个问题:

    1. 从不。绝对不要将库中的标题直接添加到您的项目中。将它们复制到您的包含目录中。
    2. #include &lt;curl.h&gt;:您使用 &lt;&gt;,这意味着 - 在包含目录中搜索。尝试将其替换为:#include "curl.h" - 这意味着搜索项目并包含目录。

    但你应该这样做。 1 - 因为此代码不是您项目的一部分。它是 curl 项目的一部分。

    编辑 如评论中所述 - 这取决于您实际放置标题的位置。如果将它们放在include\curl 目录中,则使用#include "curl/curl.h"

    问题编辑后编辑 您需要指定 .lib 引用。 当您使用 curl 时,您不会编译它。它已经被一些天才从 curl 编译成.dlls 的形式。除非您告诉它如何使用,否则您的程序不知道如何使用它们。为此,您必须更改链接器选项 - 通过提供所谓的 lib 文件。 lib 文件用于告诉链接器应该使用哪个 .dlls。

    我假设你有你的 curl 目录。除了include,还应该有lib。现在你需要做的是告诉链接器你需要来自 curl 的lib 目录的libcurl.a。继续:项目构建选项 |链接器设置。在Link libraries 部分指定libcurl.a 的路径。

    【讨论】:

    • 嗨,米哈尔。在下载的 Source Archive zip 中,我似乎找不到任何库(.a、.so、.lib 或 .dll)。顺便说一句,这是针对 Windows 的。我只在“include”、“src”和“lib”文件夹中看到 .h / .cpp 文件。我需要下载windows 64“包”吗?
    • 作为尝试使用“包”而不是“源存档”构建的实验,我创建了一个新项目并继续下载 Win64 - MinGW64 二进制包。这在 zip 文件中有“.dll”文件,但不包含源代码。它有 libcurl.dll、libeay32.dll、ssleay32.dll。我尝试在 Build Options==>Linker Settings 中将其添加为链接库,但我在文件浏览器中看不到任何显示,因为在 CodeBlocks 中,似乎唯一可接受的库文件是 *.a、*.so 、*.lib 和 *.dyl
    • 你能成功链接上面提到的.dll文件,并且能够运行源代码而不出现构建错误吗?
    • 再次阅读我的答案。 mingw curl 包中有.a 文件。您需要添加libcurl.a(这样链接器就知道,要使用哪个dlls)。
    猜你喜欢
    • 2018-12-23
    • 2022-06-10
    • 2015-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多