web-dev-qa-db-fra.com

Erreur de thread Boost: référence non définie

#include <boost/thread/thread.hpp>
#include <iostream>

void hello()
{
  std::cout <<
    "Hello world, I'm a thread!"
    << std::endl;
}

int main(int argc, char* argv[])
{
  boost::thread thrd(&hello);
  thrd.join();
  return 0;
}

J'ai couru essayé de compiler ce programme et j'ai obtenu ces erreurs:

/usr/include/boost/thread/pthread/mutex.hpp:40: undefined reference to
   `boost::thread_resource_error::thread_resource_error()'
/usr/include/boost/thread/pthread/mutex.hpp:40: undefined reference to 
   `boost::thread_resource_error::~thread_resource_error()'
/usr/include/boost/thread/pthread/mutex.hpp:40: undefined reference to 
   `typeinfo for boost::thread_resource_error'
./src/thread.o: In function `condition_variable':
/usr/include/boost/thread/pthread/condition_variable_fwd.hpp:33: 
  undefined reference to `boost::thread_resource_error::thread_resource_error()'
/usr/include/boost/thread/pthread/condition_variable_fwd.hpp:33: 
  undefined reference to `boost::thread_resource_error::~thread_resource_error()'
/usr/include/boost/thread/pthread/condition_variable_fwd.hpp:33: \
  undefined reference to `typeinfo for boost::thread_resource_error'
./src/thread.o: In function `thread_data_base':
/usr/include/boost/thread/pthread/thread_data.hpp:54: 
  undefined reference to `vtable for boost::detail::thread_data_base'
./src/thread.o: In function `thread<void (*)()>':
/usr/include/boost/thread/detail/thread.hpp:188: 
  undefined reference to `boost::thread::start_thread()'
./src/thread.o: In function `~thread_data':
/usr/include/boost/thread/detail/thread.hpp:40: 
  undefined reference to `boost::detail::thread_data_base::~thread_data_base()'
/usr/include/boost/thread/detail/thread.hpp:40: undefined reference to 
  `boost::detail::thread_data_base::~thread_data_base()'

Quelqu'un peut-il me dire pourquoi j'obtiens cette erreur?

23
lal

compiler avec la balise mt c'est-à-dire -lboost_thread-mt

37
ankita

J'avais la même question, mais -lboost_thread-mt est maintenant obsolète voir cette réponse sur askubuntu.com. Au lieu de cela, ce que vous voulez maintenant dans votre makefile (au moins pour linux) est:

-lpthread -lboost_thread ...

Boost vous a simplement donné la responsabilité de vous connecter à la bibliothèque de threads de votre système.

19
AlaskaJoslin

De nombreuses bibliothèques boost sont entièrement implémentées dans des fichiers d'en-tête. Boost.thread ne l'est pas. Il semble qu'il ne soit pas lié dans la bibliothèque de threads boost. Vérifiez vos chemins de recherche de l'éditeur de liens. Ou, comme le dit le commentaire du Stargazer712 sur l'OP, vérifiez l'installation. Vous devriez voir quelque chose comme libboost_thread-gcc-xxx-1_nn.o dans votre répertoire lib. Si tel est le cas, essayez de le référencer explicitement dans votre étape de lien (quelque chose comme -L<path_to_lib> -lboost-thread-gcc-xx-1_nn). Sinon, vous n'avez apparemment pas d'installation complète.

18
gregg

J'ai eu un problème similaire avec centos 6.5 lors de la compilation de povray 3.7 et cela l'a résolu - ajoutez simplement -lboost_thread-mt dans votre Makefile.

2
Janos Erzinger

J'ai eu la même erreur. Je l'ai corrigé en compilant avec -lboost_thread

0
Carlosio

ajouter une option de compilation

-L<path_to_lib> -lboost-thread-gcc-xx-1_nn

la réponse de Gregg est juste!

0
Kevin Zhao