Как мне связать 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 опция должна появиться после списка объектных файлов, на которые вы ссылаетесь, иначе она не будет связываться должным образом.

Вы можете попробовать использовать curl-config --libs,

Альтернативный ответ (первый отлично). Подумайте об использовании вывода, возвращаемого "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++ - Настройка путей поиска.

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