web-dev-qa-db-fra.com

Comment lier libcurl à mon programme c ++ sous linux?

Je dois utiliser libcurl dans un logiciel que j'écris sur ma machine Ubuntu. J'utilise Eclipse pour écrire et compiler tous les logiciels. Lorsque je mets les fichiers libcurl dans le même dossier que le fichier .cpp et que j'inclus le fichier curl.h dans l'en-tête, lorsque j'essaie de compiler le programme, il arrive avec ces erreurs:

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

J'ai pris le contenu du dossier include de libcurl et je l'ai placé dans le même dossier que le fichier .cpp. puis dans l'en-tête du fichier .cpp, j'ai tapé:

#include <curl/curl.h>

J'ai aussi essayé:

#include "curl/curl.h"

Des idées sur le problème? Merci.

29
Austin Witherspoon

Les inclusions de votre fichier d'en-tête sont très bien; votre problème se produit à l'étape de la liaison. Pour établir un lien avec libcurl, vous devez ajouter le -lcurl option de ligne de commande, en supposant qu'il soit installé dans un répertoire standard:

g++ -o sms ./src/sms.o -lcurl

S'il n'est pas installé dans un répertoire standard, vous devez également ajouter le -L/path/to/libcurl, par exemple. quelque chose comme:

# Assuming that /home/geekman/workspace/libcurl is where libcurl.a is located
g++ -o sms ./src/sms.o -L/home/geekman/workspace/libcurl -lcurl

Notez également que le -lcurl l'option doit apparaître après la liste des fichiers objets que vous liez, sinon elle ne se liera pas correctement.

51
Adam Rosenfield

Vous pouvez essayer d'utiliser curl-config --libs.

9
Alex Pantalones

Une réponse alternative (la première est excellente). Pensez à utiliser la sortie renvoyée par "pkg-config --libs libcurl" comme argument de votre compilateur.

Par exemple,

CPPFLAGS = `pkg-config --libs libcurl`

g ++ $ CPPFLAGS monfichier.o

Pkg-config est un moyen standard pour les bibliothèques open source de vous communiquer comment les lier/#inclure leurs fichiers.

4
Sam

Si vous utilisez ecplise CDT, vous devez suivre les étapes suivantes. Entrée sur le terminal

curl-config --libs

Sur ma machine, le résultat est

-L/usr/lib/i386-linux-gnu -lcurl

puis faites selon cette capture d'écran et vous pourrez compiler. btw n'oubliez pas d'ajouter des fichiers d'en-tête dans votre code

enter image description here

Vous entrez donc le chemin du dossier de la bibliothèque sans -L et le nom de la bibliothèque sans -l car ils seront automatiquement ajoutés par l'éditeur de liens.

2
adeel41

Vous devez lier la bibliothèque à votre programme. Avec gcc (et la plupart des autres compilateurs), vous pouvez spécifier les bibliothèques à lier avec -lname_wo_lib, par exemple. -lcurl

1
ckruse

Voir aussi GNU GCC Manual - Options for Linking pour une explication détaillée des options proposées par Adam Rosenfield. Pour les répertoires de recherche standard, voir An Introduction to GCC - for the GNU Compilers gcc and g ++ - Setting Search Paths .

0
Taha Yavuz Bodur