C++ скачать несколько файлов

Я очень плохо знаком с C++. Я скачал и скомпилировал несколько примеров без проблем.

Сейчас я пытаюсь загрузить 10 файлов с сервера и записать каждый файл в другое место / имя файла.

Глядя на этот пост, я попытался использовать код:

#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

Я гуглил, чтобы посмотреть, смогу ли я найти, что это значит, но я не нашел ничего, что я понимаю.

Как мне заставить это работать?

Спасибо

5 ответов

Решение

Прежде всего, этот код не C++, а C. Это разные языки, которые на самом деле не совместимы. В SO очень много мест, где это обсуждается, поэтому я не буду вдаваться в подробности. Вы #include <iostream>, но не используйте его нигде.

Затем вы видите ошибки компоновщика, потому что вы используете библиотеку curl, но не говорите компоновщику использовать библиотеку для преобразования имен функций в реальные символы, которые могут быть вызваны.

попробуй с -lcurl; Опять же, это C, и это тоже допустимый C++. Вы можете скомпилировать это (если вы удалите лишнее #include <iostream>) с gcc вместо g++,

Вам нужно добавить библиотеку curl для ссылки. Скорее всего, добавление -lcurl Опция к вашему вызову компилятора сделает работу.

Вы правильно включили заголовок для libcurl, но вам также необходимо явно связать динамическую библиотеку. Вы, вероятно, должны скомпилировать следующим образом:

g++ test.cpp -o new -lcurl

где -lcurl сообщает компоновщику ссылку на динамическую библиотеку libcurl.so (в системах Unix).

Взглянув на страницу Использование libcurl, она на самом деле предоставляет инструмент под названием curl-config это может помочь вам в построении правильной командной строки компилятора. На большинстве оболочек Unix/Linux вы можете использовать его следующим образом:

g++ $(curl-config --cflags --libs) test.cpp -o new

curl-config --cflags --libs выведет правильные параметры командной строки. Поместив эту команду в кавычки или $(...) означает, что этот вывод подставляется в вашу командную строку, эффективно добавляя параметры командной строки в вашу командную строку.

Вам нужно сделать ссылку на библиотеку curl. добавлять -lcurl до конца вашего вызова, что-то вроде g++ -o program program.cpp -lcurl,

Вам нужно связать libcurl с вашей программой. Используйте аргумент -l, чтобы указать компоновщику, какие библиотеки вам нужны. (Пропустите "lib" из имени библиотеки)g++ test.cpp -o new -lcurl

Другие вопросы по тегам