Как мне связать libcurl с моей программой на C++ в linux?
Мне нужно использовать libcurl в программном обеспечении, которое я пишу на своей машине с Ubuntu. Я использую Eclipse для написания и компиляции всего программного обеспечения. Когда я помещаю файлы libcurl в ту же папку, что и файл.cpp, и включаю файл curl.h в заголовок, при попытке скомпилировать программу возникают следующие ошибки:
Building target: sms
Invoking: GCC C++ Linker
g++ -o"sms" ./src/sms.o
./src/sms.o: In function `main':
/home/geekman/workspace/sms/Debug/../src/sms.cpp:38: undefined reference to `curl_easy_init'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:42: undefined reference to `curl_easy_setopt'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:44: undefined reference to `curl_easy_setopt'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:46: undefined reference to `curl_easy_perform'
/home/geekman/workspace/sms/Debug/../src/sms.cpp:47: undefined reference to `curl_easy_cleanup'
collect2: ld returned 1 exit status
make: *** [sms] Error 1
Я взял содержимое папки include из libcurl и поместил в ту же папку, что и файл.cpp. затем в заголовке файла.cpp я набрал:
#include <curl/curl.h>
Я также попробовал:
#include "curl/curl.h"
Есть идеи по проблеме? Благодарю.
7 ответов
Ваши включения в заголовочный файл просто хороши; Ваша проблема возникает на этапе связывания. Чтобы создать ссылку на libcurl, вам нужно добавить -lcurl
опция командной строки, при условии, что она установлена в стандартном каталоге:
g++ -o sms ./src/sms.o -lcurl
Если он не установлен в стандартном каталоге, вам также необходимо добавить -L/path/to/libcurl
Например, что-то вроде:
# Assuming that /home/geekman/workspace/libcurl is where libcurl.a is located
g++ -o sms ./src/sms.o -L/home/geekman/workspace/libcurl -lcurl
Также обратите внимание, что -lcurl
опция должна появиться после списка объектных файлов, на которые вы ссылаетесь, иначе она не будет связываться должным образом.
Альтернативный ответ (первый отлично). Подумайте об использовании вывода, возвращаемого "pkg-config --libs libcurl" в качестве аргумента вашему компилятору.
Например,
CPPFLAGS = `pkg-config --libs libcurl`
g ++ $ CPPFLAGS myfile.o
Pkg-config - это стандартный способ для библиотек с открытым исходным кодом сообщать вам, как создавать ссылки на них / #include их файлы.
Любой, кто использует ecplise CDT, должен выполнить следующие действия. Сначала на терминал введите
curl-config --libs
На моей машине результат
-L/usr/lib/i386-linux-gnu -lcurl
затем сделайте согласно этому скриншоту, и вы сможете скомпилировать. Кстати, не забудьте добавить заголовочные файлы в свой код
Таким образом, вы вводите путь к папке библиотеки без -L и имя библиотеки без -l, потому что они будут автоматически добавлены компоновщиком.
Вы должны связать библиотеку с вашей программой. С помощью gcc (и большинства других компиляторов) вы можете указать библиотеки для связи с -lname_wo_lib, например -lcurl
В дополнение к первому ответу мне также пришлось связать библиотеку curlpp. Итак, чтобы скомпилировать файл main.cpp, который включал curlpp, мне пришлось сделать:
g++ main.cpp -lcurl -lcurlpp
Использование только одной из двух ссылок приведет к разным ошибкам в отношении разных ссылок. Важно напомнить, что это сработало только потому, что я установил все необходимые библиотеки в стандартные подключаемые папки.
Также см. Руководство GNU GCC - Опции для связывания для подробного объяснения опций, которые сказал Адам Розенфилд. Стандартные каталоги поиска см. В разделе Введение в GCC - для компиляторов GNU gcc и g++ - Настройка путей поиска.