2010-08-27 8 views
21
#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; 
} 

je courais undefined essayé de compiler ce programme, et a ces erreurs:erreur de fil Boost: Référence

/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 je reçois cette erreur?

+0

Ressemble boost n'est pas installé sur votre système – riwalk

+0

mais mon '#include #include #include using namespace std; en utilisant l'espace de nommage boost; int main() { \t chaîne str1; \t cin >> str1; \t // chaîne str1 ("bonjour monde!"); \t to_upper (str1); \t cout << str1; return 0; } 'fonctionne parfaitement – lal

+5

Je l'ai trouvé J'ai besoin d'installer le paquet libboost-thread dans ubuntu – lal

Répondre

17

De nombreuses bibliothèques de boosters 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 oui, 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). Si non, alors vous n'avez apparemment pas une installation complète.

+5

Pour l'anecdote, c'est -lboost_thread. Voir http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html – JRG

+1

@Josh: merci pour l'entrée. Voir aussi http://www.boost.org/doc/libs/1_47_0/more/getting_started/windows.html#library-naming et http: //www.boost.org/doc/libs/1_47_0/plus/getting_started/unix-variants.html # link-votre-programme-vers-une-bibliothèque-de-boost. – gregg

0

ajouter option de compilation

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

La réponse de gregg est juste!

35

compilation avec étiquette mt i.e. -lboost_thread-mt

+2

J'ai eu un problème similaire et cela l'a résolu! Merci! –

+1

vous avez sauvé ma journée! – ducin

+0

ou '-lboost_thread-mgwXX-mt-N_NN' où XX est votre version de mgw, habituellement seulement les deux premiers (4.7.1 => 47) et Ns sont votre version boost, encore les deux premiers (boost_1_55_0 => 1_55), donc le dernier pourrait ressembler à _____ :::::: '-lboost_thread-mgw47-mt-1_55' –

2

J'ai eu un problème similaire avec CentOS 6.5 lors de la compilation povray 3.7 et cette résolu - il suffit d'ajouter -lboost_thread-mt dans votre Makefile.

12

J'ai eu la même question, mais -lboost_thread-mt est maintenant obsolète voir this answer sur askubuntu.com. Au lieu de cela ce que vous voulez maintenant dans votre makefile (au moins pour Linux) est:

-lpthread -lboost_thread ... 

Boost a simplement donné que vous la responsabilité de créer un lien vers la bibliothèque de threads de votre système.