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 选项添加到您的命令行中。