2013-11-25 3 views
0

Я пытаюсь создать образец программы curl library, который загружает файл с ftp. Я использую Eclipse IDE, ОС - Ubuntu.Связать проблемы с библиотекой скручивания

Я установил завиток с помощью команды: APT-получить установку libcurl4-gnutls-dev

Я вижу heades файлов в /usr/include/curl (я не знаю, где C-файлы)

Looks Затмение счастливых with #include <curl/curl.h>, бушель все функции завитка, используемые в программе, выполняются с 'undefined reference'.

компиляции failes с ссылающихся ошибок:

**** 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

Вы должны указать опцию компоновщика из -lcurl, по месту нахождения C/C++ build -> Settings -> GCC C Linker -> Libraries в свойствах проекта.

EDITED:

Давайте более детально.

Я вижу heades файлы в/USR/включать/завитка (я не знаю, где C-файлы)

Обычно такие пакеты не состоят из исходных кодов, вместо этого они обеспечивают до- скомпилированные объектные файлы, называемые libraries.bu, все функции curl, используемые в программе, выполняются с помощью «неопределенной ссылки».

Выглядит Затмение довольно #include

Это верно, так как путь /usr/include/ обычно внутри включаемого путь (где компилятор пытается найти заголовочные файлы), так что вам не нужно настройте что-нибудь для этого.

bu все функции curl, используемые в программе, выполняются с помощью «неопределенной ссылки».

В коде вы используете такие функции, как curl_global_init без реализации их самостоятельно, а это значит, эти функции рассматриваются как внешние функции, которые, как ожидается, будут импортированы. Вы должны «рассказать» компоновщику, где найти эти функции (точнее, эти символы). Это делается с помощью опции -l, за которой следует имя библиотеки. А для указания путей библиотек используйте -L.

Для получения дополнительной информации, вы можете увидеть в разделе опций компоновщика в Option Sammary of GCC

+0

Ровно. Ошибка 'undefined reference' означает, что компоновщик не нашел определения этой функции в любом месте вашего кода или в какой-либо определенной библиотеке. –

Смежные вопросы