簡體   English   中英

鏈接curl庫問題

[英]Linking curl library problems

我正在嘗試構建從ftp下載文件的curl庫示例程序。 我正在使用Eclipse IDE,OS- Ubuntu

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

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

看起來Eclipse with #include <curl/curl.h>感到滿意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/C++ build -> Settings -> GCC C Linker -> Libraries -lcurl C/C++ build -> Settings -> GCC C Linker -> Libraries -lcurl C/C++ build -> Settings -> GCC C Linker -> Libraries的位置指定-lcurl的鏈接器選項。

編輯:

讓我們更加詳細。

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

通常,此類軟件包不包含源代碼,而是提供預編譯的目標文件,稱為庫。所有程序中使用的curl函數均使用“未定義的引用”構成。

看起來Eclipse對#include很滿意

的確如此,因為路徑/usr/include/通常位於包含路徑內(編譯器嘗試在其中查找頭文件),因此您無需為此進行任何設置。

所有程序中使用的curl函數均使用“ undefined reference”(未定義參考)進行。

在代碼中,您可以使用curl_global_init類的curl_global_init而無需自己實現它們,這意味着這些函數將被視為要導入的外部函數。 您應該“告訴”鏈接程序在哪里可以找到這些功能(更確切地說,這些符號)。 通過使用選項-l和庫名來完成。 對於指定庫的路徑,請使用-L

有關更多信息,您可以在GCC的Option Sammary中查看鏈接器選項部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM