web-dev-qa-db-fra.com

Lier la bibliothèque Boost sous Linux

J'essaie de construire un projet en utilisant Asio de Boost et j'ai quelques problèmes. Au départ, j'ai essayé de construire le projet sans aucune bibliothèque supplémentaire puisque tout est censé être dans les fichiers d'en-tête.

Le programme que j'essaie de créer ressemble à ceci:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

int main()
{
    boost::asio::io_service io;
    boost::asio::deadline_timer t(io, boost::posix_time::seconds(5));

    t.wait();

    std::cout << "Hello, world!" << std::endl;

    return 0;
}

Il peut être trouvé ici sur le site Web de Boost.

Donc, au départ, je viens d'avoir:

-I /usr/include/boost_1_40_0

Cela a entraîné les erreurs suivantes:

make -k all
Building target: HelloWorld
Invoking: GCC C++ Linker
g++  -o"HelloWorld"  ./main.o  
./main.o: In function `__static_initialization_and_destruction_0':
/usr/include/boost_1_40_0/boost/system/error_code.hpp:205: undefined reference to `boost::system::get_system_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:206: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:211: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:212: undefined reference to `boost::system::get_generic_category()'
/usr/include/boost_1_40_0/boost/system/error_code.hpp:213: undefined reference to `boost::system::get_system_category()'
./main.o: In function `boost::asio::error::get_system_category()':
/usr/include/boost_1_40_0/boost/asio/error.hpp:218: undefined reference to `boost::system::get_system_category()'
./main.o: In function `error_code':
/usr/include/boost_1_40_0/boost/system/error_code.hpp:312: undefined reference to `boost::system::get_system_category()'
./main.o: In function `posix_tss_ptr':
/usr/include/boost_1_40_0/boost/asio/detail/posix_tss_ptr.hpp:47: undefined reference to `pthread_key_create'
./main.o: In function `~posix_tss_ptr':
/usr/include/boost_1_40_0/boost/asio/detail/posix_tss_ptr.hpp:61: undefined reference to `pthread_key_delete'
./main.o: In function `boost::asio::detail::posix_thread::join()':
/usr/include/boost_1_40_0/boost/asio/detail/posix_thread.hpp:77: undefined reference to `pthread_join'
./main.o: In function `~posix_thread':
/usr/include/boost_1_40_0/boost/asio/detail/posix_thread.hpp:69: undefined reference to `pthread_detach'
collect2: ld returned 1 exit status
make: *** [HelloWorld] Error 1
make: Target `all' not remade because of errors.

Il est apparu que j'avais besoin de la bibliothèque système. J'ai donc suivi les instructions du guide de démarrage trouvé ici , ce qui m'a donné un tas de bibliothèques situées dans /usr/include/boost_1_40_0/stage/lib . Parmi eux se trouvait libboost_system.a . Ainsi, j'ai tenté de compiler avec:

-I /usr/include/boost_1_40_0
-L /usr/include/boost_1_40_0/stage/lib
-l libboost_system

Cependant, j'ai ceci:

make -k all
Building target: HelloWorld
Invoking: GCC C++ Linker
g++ -L/usr/lib -L/usr/include/boost_1_40_0/stage/lib -o"HelloWorld"  ./main.o   -llibboost_system
/usr/bin/ld: cannot find -llibboost_system
collect2: ld returned 1 exit status
make: *** [HelloWorld] Error 1
make: Target `all' not remade because of errors.

Je ne sais pas pourquoi, mais il semble impossible d'identifier la bibliothèque ou l'une des autres que j'essaie. Que pourrais-je faire de manière incorrecte? Merci d'avance!

29
Scott

Changement -llibboost_system à -lboost_system.

Sous Linux, le préfixe "lib" devant une bibliothèque n'est pas utilisé lors du référencement de ladite bibliothèque.

32
jameszhao00

Dans ce cas, la réponse de James était correcte, mais si quelqu'un d'autre tombe sur ce message comme je l'ai fait, sachez que vous pouvez obtenir ce message si vous liez d'anciens en-têtes boost à des bibliothèques plus récentes. get_system_category() spécifiquement a été déprécié. J'ai rencontré ce problème en incluant accidentellement des en-têtes fournis par la distribution, mais en établissant une liaison avec ma propre copie interne de boost.

25
tgoodhart

Si vous rencontrez toujours des problèmes, vous voudrez peut-être inclure des threads posix en ajoutant aux indicateurs de l'éditeur de liens:

-lpthread
20
Gerhard Stein