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