2010-08-27 1 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; 
} 

mi sono imbattuto cercato di compilare questo programma, ed ha ottenuto questi errori:Boost Errore filo: undefined reference

/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()' 

uno può dire perché sto ottenendo questo errore?

+0

Suona come spinta non è installato correttamente sul sistema – riwalk

+0

ma il mio '#include #include #include utilizzando namespace std; utilizzando boost di namespace; int main() { \t string str1; \t cin >> str1; \t // string str1 ("ciao mondo!"); \t to_upper (str1); \t cout << str1; ritorno 0; } 'funziona perfettamente – lal

+5

ho trovato che ho bisogno di installare il pacchetto libboost-thread in ubuntu – lal

risposta

17

Molte librerie di boost sono completamente implementate nei file di intestazione. Boost.thread non lo è. Sembra che non stia collegando nella libreria di boost. Controlla i percorsi di ricerca del linker. Oppure, come dice il commento di Stargazer712 sull'OP, controlla l'installazione. Dovresti vedere qualcosa come libboost_thread-gcc-xxx-1_nn.o nella tua directory lib. Se è così, prova a fare riferimento in modo esplicito nel tuo passaggio link (qualcosa come -L<path_to_lib> -lboost-thread-gcc-xx-1_nn). In caso contrario, apparentemente non hai un'installazione completa.

+5

Per la cronaca, è -lboost_thread. Vedi http://antonym.org/2009/05/threading-with-boost---part-i-creating-threads.html – JRG

+1

@Josh: grazie per l'input. Vedi anche http://www.boost.org/doc/libs/1_47_0/more/getting_started/windows.html#library-naming e http: //www.boost.org/doc/librerie/1_47_0/più/Getting_Started/unix-variants.html # link-your-programma-per-un-boost-biblioteca. – gregg

0

aggiungere compilare opzione

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

risposta di Gregg è giusto!

35

compilare con tag mt cioè -lboost_thread-mt

+2

Ho avuto un problema simile e questo lo ha risolto! Grazie! –

+1

hai salvato la mia giornata! – ducin

+0

o '-lboost_thread-mgwXX-mt-N_NN' dove XX è la tua versione di mgw, di solito solo i primi due (4.7.1 => 47) e Ns sono la tua versione di boost, di nuovo i primi due (boost_1_55_0 => 1_55), quindi l'ultima potrebbe sembrare _____ :::::: '-lboost_thread-mgw47-mt-1_55' –

2

Ho avuto un problema simile con CentOS 6.5 durante la compilazione Povray 3.7 e questo risolto - è sufficiente aggiungere -lboost_thread-mt nel vostro Makefile.

12

Ho avuto la stessa domanda, ma -lboost_thread-mt ora è deprecato vedere this answer su askubuntu.com. Invece ciò che ora vuoi nel tuo makefile (almeno per Linux) è:

-lpthread -lboost_thread ... 

Boost ha semplicemente dato la responsabilità di creare un collegamento a libreria di thread del sistema.