[英]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.