C++ 下载多个文件
c++ download multiple files
我是 c++ 的新手,我已经下载并编译了几个没有问题的示例。
现在我正尝试从服务器下载 10 个文件并将每个文件写入不同的 location/filename。
查看 this post 我尝试使用代码:
#include <iostream>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
void downloadFile(const char* url, const char* fname) {
CURL *curl;
FILE *fp;
CURLcode res;
curl = curl_easy_init();
if (curl){
fp = fopen(fname, "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
}
int main(void){
downloadFile("http://servera.com/file.txt", "filename.txt");
downloadFile("http://servera.com/file2.txt", "filename2.txt");
downloadFile("http://serverb.com/file1.txt", "filename1b.txt");
return 0;
}
但是当我使用 g++ test.cpp -o new
编译它时,我得到以下错误:
/tmp/cca1J32y.o: In function `downloadFile(char const*, char const*)':
test.cpp:(.text+0x35): undefined reference to `curl_easy_init'
test.cpp:(.text+0x72): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0x8d): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0xa7): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0xb2): undefined reference to `curl_easy_perform'
test.cpp:(.text+0xc0): undefined reference to `curl_easy_cleanup'
collect2: error: ld returned 1 exit status
我用谷歌搜索看是否能找到这意味着什么,但我没有找到任何我理解的东西。
如何让它工作?
谢谢
您需要将 curl 库添加到 link 反对。很可能在您的编译器调用中添加一个 -lcurl
选项就可以完成这项工作。
您需要 link 针对 curl 库。将 -lcurl
添加到调用的末尾,例如 g++ -o program program.cpp -lcurl
.
首先,该代码不是 C++,而是C。这些是不同的语言,真的不兼容。 SO上有非常非常多的地方讨论这个,这里就不赘述了。你 #include <iostream>
,但不要在任何地方使用它。
然后,您看到的是链接器错误,因为您使用 curl 库,但没有告诉链接器使用该库将函数名称解析为可以调用的实际符号。
试试 -lcurl
;同样,这是 C,而且恰好也是有效的 C++。您可以使用 gcc
而不是 g++
.
来编译它(如果您删除多余的 #include <iostream>
)
您需要 link 将 libcurl 添加到您的程序中。使用 -l 参数告诉 linker 您需要哪些库。 (跳过库名的"lib")
g++ test.cpp -o new -lcurl
您为 libcurl
添加了 header 是正确的,但您还需要针对动态库显式 link。您可能需要按如下方式编译:
g++ test.cpp -o new -lcurl
其中 -lcurl
告诉 linker link 反对名为 libcurl.so
的动态库(在 Unix 系统上)。
看看 Using libcurl page,它实际上提供了一个名为 curl-config
的工具,可以帮助您构建正确的编译器命令行。在大多数 Unix/Linux shell 上,您可以按如下方式使用它:
g++ $(curl-config --cflags --libs) test.cpp -o new
curl-config --cflags --libs
将输出正确的 command-line 选项。将该命令放在反引号或 $(...)
中意味着此输出被替换到您的命令行中,有效地将 command-line 选项添加到您的命令行中。
我是 c++ 的新手,我已经下载并编译了几个没有问题的示例。
现在我正尝试从服务器下载 10 个文件并将每个文件写入不同的 location/filename。
查看 this post 我尝试使用代码:
#include <iostream>
#include <stdio.h>
#include <curl/curl.h>
#include <string.h>
size_t write_data(void *ptr, size_t size, size_t nmemb, FILE *stream) {
size_t written;
written = fwrite(ptr, size, nmemb, stream);
return written;
}
void downloadFile(const char* url, const char* fname) {
CURL *curl;
FILE *fp;
CURLcode res;
curl = curl_easy_init();
if (curl){
fp = fopen(fname, "wb");
curl_easy_setopt(curl, CURLOPT_URL, url);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp);
res = curl_easy_perform(curl);
curl_easy_cleanup(curl);
fclose(fp);
}
}
int main(void){
downloadFile("http://servera.com/file.txt", "filename.txt");
downloadFile("http://servera.com/file2.txt", "filename2.txt");
downloadFile("http://serverb.com/file1.txt", "filename1b.txt");
return 0;
}
但是当我使用 g++ test.cpp -o new
编译它时,我得到以下错误:
/tmp/cca1J32y.o: In function `downloadFile(char const*, char const*)':
test.cpp:(.text+0x35): undefined reference to `curl_easy_init'
test.cpp:(.text+0x72): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0x8d): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0xa7): undefined reference to `curl_easy_setopt'
test.cpp:(.text+0xb2): undefined reference to `curl_easy_perform'
test.cpp:(.text+0xc0): undefined reference to `curl_easy_cleanup'
collect2: error: ld returned 1 exit status
我用谷歌搜索看是否能找到这意味着什么,但我没有找到任何我理解的东西。
如何让它工作?
谢谢
您需要将 curl 库添加到 link 反对。很可能在您的编译器调用中添加一个 -lcurl
选项就可以完成这项工作。
您需要 link 针对 curl 库。将 -lcurl
添加到调用的末尾,例如 g++ -o program program.cpp -lcurl
.
首先,该代码不是 C++,而是C。这些是不同的语言,真的不兼容。 SO上有非常非常多的地方讨论这个,这里就不赘述了。你 #include <iostream>
,但不要在任何地方使用它。
然后,您看到的是链接器错误,因为您使用 curl 库,但没有告诉链接器使用该库将函数名称解析为可以调用的实际符号。
试试 -lcurl
;同样,这是 C,而且恰好也是有效的 C++。您可以使用 gcc
而不是 g++
.
#include <iostream>
)
您需要 link 将 libcurl 添加到您的程序中。使用 -l 参数告诉 linker 您需要哪些库。 (跳过库名的"lib")
g++ test.cpp -o new -lcurl
您为 libcurl
添加了 header 是正确的,但您还需要针对动态库显式 link。您可能需要按如下方式编译:
g++ test.cpp -o new -lcurl
其中 -lcurl
告诉 linker link 反对名为 libcurl.so
的动态库(在 Unix 系统上)。
看看 Using libcurl page,它实际上提供了一个名为 curl-config
的工具,可以帮助您构建正确的编译器命令行。在大多数 Unix/Linux shell 上,您可以按如下方式使用它:
g++ $(curl-config --cflags --libs) test.cpp -o new
curl-config --cflags --libs
将输出正确的 command-line 选项。将该命令放在反引号或 $(...)
中意味着此输出被替换到您的命令行中,有效地将 command-line 选项添加到您的命令行中。