我正在尝试构建从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;
}
答案 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
中看到链接器选项部分