链接卷曲库问题
我正在尝试构建从ftp下载文件的卷曲库示例程序。我正在使用Eclipse
IDE,OS - Ubuntu
。链接卷曲库问题
我已经安装使用卷曲命令: 易于得到的/usr/include/curl
安装libcurl4-gnutls-dev
我看到heades文件(我不知道哪里是C文件)
看起来Eclipse是幸福with #include <curl/curl.h>
,所有BU在程序中使用的卷曲函数使用'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;
}
您应指定-lcurl
链接器选项,在C/C++ build -> Settings -> GCC C Linker -> Libraries
在项目属性的位置。
编辑:
让我们更详细。
我看到heades文件在/ usr/include中/卷曲(我不知道哪里是C文件)
通常这样的包不包括源代码,而不是他们提供的预编译的目标文件名为libraries.bu所有在程序中使用的curl函数都使用'undefined reference'。
看起来Eclipse是快乐的用#include
这是真的,因为路径/usr/include/
通常包含路径(如编译器试图找到头文件)里面,这样你就不需要为此设置任何东西。
bu程序中使用的所有卷曲函数都使用“未定义参考”。
在你使用像curl_global_init
功能,而无需自己执行这些代码,这意味着这些函数被看作是预计将引入的外部功能。你应该“告诉”链接器在哪里找到这些功能(更准确地说,是这些符号)。这是通过使用选项-l
,然后是库名称完成的。并且为了指定库的路径,使用-L
。
欲了解更多信息,你可以看到在Option Sammary of GCC
没错的链接器选项的部分。未定义的引用错误意味着链接器没有在代码的任何位置或任何指定的库中找到该函数的定义。 –