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?
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.