【问题标题】:Linking curl library problems链接 curl 库问题
【发布时间】:2013-11-25 11:53:59
【问题描述】:

我正在尝试构建从 ftp 下载文件的 curl 库示例程序。我正在使用 Eclipse IDE ,操作系统 -Ubuntu。

我已经使用命令安装了 curl: apt-get install libcurl4-gnutls-dev

我在/usr/include/curl看到了heades文件(我不知道c文件在哪里)

看起来Eclipse很高兴with #include <curl/curl.h>,但是程序中使用的所有curl函数都是用'undefined reference'制作的。

编译失败并出现链接错误:

**** Build of configuration Debug for project updDown ****

make all 
Building target: updDown
Invoking: GCC C Linker
gcc  -o "updDown"  ./src/updDown.o   
./src/updDown.o: In function `main':
/home/g/proj/updDown/Debug/../src/updDown.c:45: undefined reference to `curl_global_init'
/home/g/proj/updDown/Debug/../src/updDown.c:47: undefined reference to `curl_easy_init'
/home/g/proj/updDown/Debug/../src/updDown.c:52: undefined reference to `curl_easy_setopt'
/home/g/proj/updDown/Debug/../src/updDown.c:55: undefined reference to `curl_easy_setopt'
/home/g/proj/updDown/Debug/../src/updDown.c:57: undefined reference to `curl_easy_setopt'
/home/g/proj/updDown/Debug/../src/updDown.c:60: undefined reference to `curl_easy_setopt'
/home/g/proj/updDown/Debug/../src/updDown.c:62: undefined reference to `curl_easy_perform'
/home/g/proj/updDown/Debug/../src/updDown.c:65: undefined reference to `curl_easy_cleanup'
/home/g/proj/updDown/Debug/../src/updDown.c:76: undefined reference to `curl_global_cleanup'
collect2: error: ld returned 1 exit status
make: *** [updDown] Error 1

**** Build Finished ****

如何解决这个问题?

完整代码:

/*
 ============================================================================
 Name        : updDown.c
 Author      : 
 Version     :
 Copyright   : Your copyright notice
 Description : Hello World in C, Ansi-style
 ============================================================================
 */

#include <stdio.h>
#include <stdlib.h>
#include <curl/curl.h>

struct FtpFile {
  const char *filename;
  FILE *stream;
};

static size_t my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
{
  struct FtpFile *out=(struct FtpFile *)stream;
  if(out && !out->stream) {
    /* open file for writing */
    out->stream=fopen(out->filename, "wb");
    if(!out->stream)
      return -1; /* failure, can't open file to write */
  }
  return fwrite(buffer, size, nmemb, out->stream);
}


int main(void)
{

    puts("starting");

  CURL *curl;
  CURLcode res;
  struct FtpFile ftpfile={
    "curl.tar.gz", /* name to store the file as if succesful */
    NULLs
  };

  curl_global_init(CURL_GLOBAL_DEFAULT);

  curl = curl_easy_init();
  if(curl) {
    /*
     * You better replace the URL with one that works!
     */
    curl_easy_setopt(curl, CURLOPT_URL,
                     "ftp://ftp.example.com/pub/www/utilities/curl/curl-7.9.2.tar.gz");
    /* Define our callback to get called when there's data to be written */
    curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
    /* Set a pointer to our struct to pass to the callback */
    curl_easy_setopt(curl, CURLOPT_WRITEDATA, &ftpfile);

    /* Switch on full protocol/debug output */
    curl_easy_setopt(curl, CURLOPT_VERBOSE, 1L);

    res = curl_easy_perform(curl);

    /* always cleanup */
    curl_easy_cleanup(curl);

    if(CURLE_OK != res) {
      /* we failed */
      fprintf(stderr, "curl told us %d\n", res);
    }
  }

  if(ftpfile.stream)
    fclose(ftpfile.stream); /* close the local file */

  curl_global_cleanup();

  return 0;
}

【问题讨论】:

标签: c curl


【解决方案1】:

您应在项目属性中C/C++ build -&gt; Settings -&gt; GCC C Linker -&gt; Libraries 的位置指定-lcurl 的链接器选项。

已编辑:

让我们更详细一点。

我在 /usr/include/curl 中看到了头文件(我不知道 c 文件在哪里)

通常此类包不包含源代码,而是提供名为 library.bu 的预编译目标文件。程序中使用的所有 curl 函数均使用“未定义引用”。

看起来 Eclipse 对#include 很满意

这是真的,因为路径 /usr/include/ 通常位于包含路径中(编译器试图在其中查找头文件),因此您无需为此设置任何内容。

程序中使用的所有 curl 函数都是用“未定义的引用”制作的。

在代码中,您使用 curl_global_init 之类的函数而不自己实现它们,这意味着这些函数被视为预期要导入的外部函数。您应该“告诉”链接器在哪里可以找到这些函数(更准确地说,是这些符号)。这是通过使用选项-l 后跟库名称来完成的。而要指定库的路径,请使用-L。

有关更多信息,您可以查看Option Sammary of GCC 中的链接器选项部分

【讨论】:

  • 没错。 undefined reference 错误意味着链接器在您的代码或任何指定库中的任何位置都没有找到该函数的定义。
猜你喜欢
  • 2018-07-21
  • 2011-11-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-26
  • 2014-04-18
  • 1970-01-01
相关资源
最近更新 更多