链接卷曲库问题

时间:2013-11-25 11:53:59

标签: c curl

我正在尝试构建从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 ****

如何解决这个问题?

Hwole代码:

/*
 ============================================================================
 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;
}

1 个答案:

答案 0 :(得分:1)

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

<强>编辑:

让我们更详细一点。

  

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

通常这样的包不包含源代码,而是提供名为libraries.bu的预编译目标文件。程序中使用的所有curl函数都使用'undefined reference'。

  

看起来Eclipse很满意#include

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

  

bu程序中使用的所有curl函数都使用'undefined reference'。

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

有关详细信息,您可以在Option Sammary of GCC

中看到链接器选项部分