2014-04-19 2 views
0

J'essaie d'utiliser la fonction boost :: filesystem :: exists. Lorsque j'essaie de lier, je reçoisImpossible de lier lors de l'utilisation de boost :: filesystem

/usr/local/include/boost/filesystem/operations.hpp:289: undefined reference to `boost::filesystem::detail::status(boost::filesystem::path const&, boost::system::error_code*)' 

erreur.

J'ai effectué une recherche Google pendant un certain temps et trouvé uniquement des réponses «lien-avec-boost». Dans mon cas -lboost_system et -lboost_filesystem spécifié pour linker, mais cela ne semble pas fonctionner. En fait, je peux utiliser boost :: filesytem :: path (par exemple), mais quand j'essaie d'utiliser quoi que ce soit, ce qui nécessite un en-tête boost/filesystem.hpp, j'obtiens des erreurs de liens. Des idées?

P.S. J'utilise gcc-4.6.4 et boost lib installé à partir de repos, mais je suppose que gcc-4.6.4 est la version par défaut de gcc pour mon ubuntu 12.04. Je suppose que je n'ai pas besoin de compiler boost de la source?

Répondre

2

Il existe de nombreuses options pour l'éditeur de liens (ld) pour spécifier le chemin de recherche pour résoudre les bibliothèques partagées, man ld vous donnera toutes les options. Supposons que vous avez installé dans /usr/local/lib coup de pouce, vous pouvez ajouter une de ces options à gcc pour transmettre à l'éditeur de liens:

  • -L =/usr/local/lib

    répertoires spécifiés sur la La ligne de commande est recherchée avant les répertoires par défaut. Toutes les options -L s'appliquent à toutes les options -l, indépendamment de l'ordre dans lequel les options apparaissent. Si searchdir commence par "=", alors le "=" sera remplacé par le préfixe sysroot, un chemin spécifié lorsque l'éditeur de liens est configuré. L'option -L définit uniquement un chemin de recherche de bibliothèque à la compilation; Si vous voulez qu'une bibliothèque partagée soit trouvée à l'exécution, son répertoire doit être connu lors de l'exécution.

  • -Wl, -rpath,/usr/local/lib

    Ajouter un répertoire au chemin de recherche de bibliothèque d'exécution. Ceci est utilisé lors de la liaison d'un exécutable ELF avec des objets partagés. Tous les arguments -rpath sont concaténés et transmis à l'éditeur de liens d'exécution, qui les utilise pour localiser les objets partagés lors de l'exécution. L'option -rpath est également utilisée pour localiser les objets partagés nécessaires aux objets partagés explicitement inclus dans le lien; voir la description de l'option -rpath-link. Si -rpath n'est pas utilisé lors de la liaison d'un exécutable ELF, le contenu de la variable d'environnement "LD_RUN_PATH" sera utilisé s'il est défini.

Une autre alternative consiste à ajouter à votre LD_LIBRARY_PATH l'emplacement de vos bibliothèques Boost.

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib 

L'éditeur de liens (ld) utilise LD_LIBRARY_PATH comme l'un des chemins de recherche pour localiser les bibliothèques partagées nécessaires.

Vous pouvez en savoir plus sur l'éditeur de liens et les bibliothèques partagées here.

Pour bien comprendre pourquoi votre installation ne trouve pas les bibliothèques de boost par défaut, vous pouvez trouver this answer at stackexchange informative. Cette méthode SO answer suggère d'utiliser boost m4.

+0

Merci, amdn. Vous m'avez conduit à la solution. Il y a deux ensembles de fichiers de bibliothèque boost dans mon système:/usr/lib et/usr/local/lib. Par défaut/usr/lib est utilisé. Donc ce qui a fonctionné pour moi est de spécifier l'option -L/usr/local/lib de l'éditeur de liens. S'il vous plaît, éditez votre réponse en fonction de mon commentaire, afin que je puisse l'accepter. – Roman

+0

@Farrel Glad ma réponse a été utile ... je ne sais pas exactement comment vous souhaitez que j'inclue la solution qui a fonctionné pour vous ... devrait-il être une autre alternative ou suggériez-vous que je supprime la référence à LD_LIBRARY_PATH? – amdn

+0

Il suffit d'ajouter cette solution à votre réponse et je vais marquer le fil comme une réponse. LD_LIBRARY_PATH est plus vrai moyen de résoudre le problème, je suppose. Mais pour ceux qui n'ont besoin que d'une solution rapide, l'option -L fonctionnera (j'ai juste essayé d'utiliser votre methid, mais ça n'a pas fonctionné pour moi: peut-être que j'ai mal installé le boot. Faites avec.). – Roman

Questions connexes