2009-08-20 3 views
5

J'apprends Boost et j'ai des problèmes avec mes fichiers make. Voici mon makefile de base:Y compris les bibliothèques boost dans les fichiers make

accesstimer: acctime.o btimer.o 
    g++ acctime.o btimer.o -o accesstimer 

acctime.o: acctime.cpp btimer.h 
    g++ -c acctime.cpp 

bentimer.o: btimer.cpp btimer.h 
    g++ -c btimer.cpp 

Lorsque acctime.cpp n'a pas d'éléments du système de fichiers de boost en ce qu'il m, fichier Ake fonctionne très bien. Dès que j'ajoute des éléments du système de fichiers boost, je dois évidemment faire référence à la librairie boost dans le fichier make, c'est là que j'ai des problèmes.

La ligne suivante fonctionne pour une seule compilation du fichier:

g++ -I /usr/local/boost/boost_1_39_0 boosttest1.cpp -o bt1 /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

Maintenant, je suis en train d'intégrer dans le fichier makefile. J'ai essayé beaucoup d'après ce que je peux trouver des informations sur le web mais aucune ne travaille ceci est mon dernier:

accesstimer: acctime.o bentimer.o 
    g++ acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c -I /usr/local/boost/boost_1_39_0 acctime.cpp /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Malheureusement, il stlill ne peut pas trouver les bibliothèques Boost, quelqu'un peut-il aider? grâce

Après avoir lu l'avis des personnes qui ont répondu que j'ai maintenant ceci:

accesstimer: acctime.o bentimer.o 
    g++ -L /usr/local/boost/boost_1_39_0 acctime.o /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Mais cela ne fonctionne pas toujours un lien.

Voici le message d'erreur que je reçois: (Merci beaucoup apprécié)

g++ -L /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a /usr/local/boost/boost_1_39_0/stage/lib/libboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
acctime.o: In function boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)': 
acctime.cpp:(.text._ZN5boost10filesystem6existsINS0_10basic_pathISsNS0_11path_traitsEEEEENS_9enable_ifINS0_13is_basic_pathIT_EEbE4typeERKS7_[boost::enable_if<boost::filesystem::is_basic_path<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >, bool>::type boost::filesystem::exists<boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> >(boost::filesystem::basic_path<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, boost::filesystem::path_traits> const&)]+0x26): undefined reference to `boost::filesystem::detail::status_api(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int&)' 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

des conseils de la suite orsogufo maintenant ceci:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 

acctime.o: acctime.cpp bentimer.h 
    g++ -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

regardant mieux, mais ne peut toujours pas tout à fait trouver la bibliothèque:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib -llibboost_filesystem-gcc41-mt.a -llibboost_system-gcc41-mt.a acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt.a 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

J'ai vérifié cette localisation et la bibliothèque est définitivement à: /usr/local/boost/boost_1_39_0/stage/lib/libboost_filesystem-gcc41-mt.a

toujours pas de joie, usimg maintenant:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0 -lboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Obtenir:

g++ -L/usr/local/boost/boost_1_39_0/stage/lib/ -llibboost_filesystem-gcc41-mt acctime.o bentimer.o -o accesstimer 
/usr/bin/ld: cannot find -llibboost_filesystem-gcc41-mt 
collect2: ld returned 1 exit status 
make: *** [accesstimer] Error 1 

Il est travailler avec ceci:

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer  

acctime.o: acctime.cpp bentimer.h 
    g++ -I /usr/local/boost/boost_1_39_0 -c acctime.cpp 

bentimer.o: bentimer.cpp bentimer.h 
    g++ -c bentimer.cpp 

Merci pour votre aide

+0

Pourriez-vous s'il vous plaît poster le message d'erreur que vous obtenez? –

+0

Lorsque vous liez des bibliothèques avec le drapeau -l, vous laissez toujours le premier "lib". Donc relier libm.a est -lm, libboost est -lboost, etc. –

Répondre

9

ÉDITÉ
Lorsque vous liez les fichiers objet pour créer l'exécutable (votre première règle de makefile) vous devez passer l'emplacement des bibliothèques Boost avec le -L drapeau et les noms des bibliothèques avec l'option -l .

accesstimer: acctime.o bentimer.o 
    g++ -L/usr/local/boost/boost_1_39_0/stage/lib -lboost_filesystem acctime.o bentimer.o -o accesstimer 

/usr/local/boost/boost_1_39_0/stage/lib est le répertoire contenant les bibliothèques et boost_filesystem le nom du fichier de la bibliothèque sans le début lib (modifier ces deux selon le cas).

UN AUTRE ÉDIT Le fichier .a que vous essayez de lier n'est pas le bon ... la bibliothèque ne devrait pas avoir d'extension.

2

Vous devez ajouter les bibliothèques boost à la phase de liaison (la ligne cible d'accesstimer) et non à la phase de compilation (où seul le chemin d'inclusion est nécessaire).

0

Bonjour Voici la procédure complète pour ajouter un boost au fichier cmake/make. Cette réponse est spécialement développée pour le programmeur débutant en cpp.

Si vous souhaitez ajouter le support de la bibliothèque boost à l'aide de Makefile, vous devez spécifier le chemin de la bibliothèque (avec l'option -L) et les bibliothèques (avec l'option -l).

-L chemin/vers/les/bibliothèques -l llibrary

** Maintenant, comment trouver chemin vers les bibliothèques **

Après l'astuce:

  1. Commande de terminal et de feu ouverte

    $ locate boost> libboost.txt

    $ gedit libboost.txt

  2. Cette commande ouvre un fichier texte qui contient tous les chemins de la bibliothèque Boost.

  3. Maintenant trouver ("ctr + F") libboost, qui met en évidence les fichiers de bibliothèque de boost avec l'extension .a et .so dans ce fichier texte.

  4. Copiez le chemin d'accès de ces fichiers .so.

    par exemple: Si .so fichier présent que sur /usr/lib/x86_64-linux-gnu/libboost_filesystem.so

    puis spécifiez chemin comme: -L/usr/lib/x86_64-linux- gnu/

maintenant, comment trouver la bibliothèque respective?

  1. Cela dépend de fonctionnalités boost/modules que vous utilisez

    par exemple: Si vous utilisez un filetage de boost, vous aurez besoin des bibliothèques suivantes

    libboost_filesystem.so

    libboost_thread.si

    libboost_system.so

  2. Ajouter au-dessus des bibliothèques comme suit avec option -l:

    -l lboost_filesystem

    -l lboost_thread

    - l lboost_system

Espérons que cela vous aide, plus S'il y a plus moyen facile, s'il vous plaît suggèrent

Questions connexes