web-dev-qa-db-fra.com

Problème de bibliothèque c ++ boost: impossible de trouver -lboost_system ld a renvoyé 1 état de sortie

J'ai un problème avec boost. Après avoir installé boost avec la commande suivante

Sudo apt-get install python-dev 
Sudo apt-get install libboost-python1.54 
Sudo apt-get install libboost-system1.54 libboost-filesystem1.54 
tar -zxf Boost-2014.10.tar.gz 
cd ~/build-2014.10/ 
./bootstrap.sh 
Sudo ./b2 install -j8 --prefix=/usr --libdir=/usr/lib --includedir=/usr/include --build-type=minimal variant=release --layout=tagged threading=single threading=multi

la version boost est 1.57. Ensuite, je lance un exemple à tester. code comme

#include <iostream>
using namespace std;
#include <boost/lexical_cast.hpp>
#include <boost/filesystem.hpp>
int main(){
    cout<<"hello"<<endl;
     int a=boost::lexical_cast<int>("123456");
     cout<<"boost "<<a<<endl;
     return 1;} 

Puis je le compile, erreur montre

g++ test -o test.cpp -lboost_system
/usr/bin/ld: cannot find -lboost_system
collect2: error: ld returned 1 exit status

Si je supprime la ligne

#include <boost/filesystem.hpp>

et compiler avec

g++ test -o test.cpp it works.

Comment le résoudre?

1
Zhao Hao

Assurez-vous de bien comprendre la différence entre les fichiers d’en-tête et les bibliothèques.

Les fichiers d'en-tête (tels que /usr/include/boost/filesystem.hpp) correspondent à ce que vous utilisez dans votre code source dans le cadre de votre directive #include. Le préprocesseur C++ lit ce fichier et ajoute une série de déclarations à votre programme.

Une bibliothèque est un ensemble compilé de diverses fonctions, données statiques et autres éléments. Lorsque vous utilisez le paramètre -lboost_system, vous indiquez au compilateur "Compiler mon programme et le lier à la bibliothèque libboost_system".

Votre éditeur de liens se plaint de ne pas trouver cette bibliothèque (/usr/bin/ld: cannot find -lboost_system). La raison probable est que le script ./bootstrap.sh n'a pas installé boost dans les répertoires appropriés.

A partir de là, vous avez deux options.

Si vous voulez vous en tenir à Boost-2014.10.tar.gz, vous êtes seul.

Je recommanderais d'installer le paquet libboost-dev. Il installera quelle que soit la version actuelle de boost pour votre système et mettra tous les fichiers aux endroits appropriés.

Et enfin: lorsque vous avez supprimé la ligne #include de votre fichier, cela fonctionnait, mais uniquement parce que votre programme n'utilisait aucune fonctionnalité de boost :: system. Si vous utilisiez des classes/fonctions de renforcement, vous obtiendrez des erreurs de compilation si les en-têtes appropriés ne sont pas inclus.

3
sмurf