2016-07-06 3 views
2

Я создаю приложение, которое использует стороннюю библиотеку (Box2D-MT), которую я создаю из источников. При компоновке, я получаю эту неопределенную ссылочную ошибку:Получение undefined ссылки на std :: thread :: _ M_start_thread

b2Threading.cpp:(.text._ZNSt6threadC2IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_[_ZNSt6threadC5IM12b2ThreadPoolFviEJPS1_iEEEOT_DpOT0_]+0xa4): 
undefined reference to 'std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)())' 

Я строй с г ++ и связью с

-lBox2D -lpthread -lrt -ldl -lstdc++ 

также, я компиляция с

-std=c++11 

смотрит в libstdC++ а. Я вижу аналогичный этот символ (это «Т»):

nm -C /usr/lib/gcc/x86_64-linux-gnu/4.9.2/libstdc++.a | grep _M_start_thread 
0000000000000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 

, но эта перегрузка не принимает второй параметр.

Я искал весь интернет для чего-то подобного, но никто, кажется, не имел этой проблемы раньше (в любом контексте).

Любой намек на то, почему я получаю эту ошибку и как я могу ее решить?

+0

Использовать флаг компилятора '-pthread' вместо' -lpthread'. Используйте его для компиляции и компоновки. –

+0

@ πάνταῥεῖ попробовал это прямо сейчас, я получаю точно такую ​​же ошибку –

+1

Какова ваша ** полная ** ссылка команда? –

ответ

1

Похож на несоответствие версии заголовков/библиотек. Это то, что у меня есть:

$ nm -C /pkgs/gcc/4.9.2/lib/libstdc++.a | grep std::thread::_M_start_thread 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 

$ nm -C /pkgs/gcc/5.2.0/lib/libstdc++.a | grep std::thread::_M_start_thread 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>) 
00000000 T std::thread::_M_start_thread(std::shared_ptr<std::thread::_Impl_base>, void (*)()) 

$ fgrep -r M_start_thread /usr/intel/pkgs/gcc/4.9.2/include/ 
/pkgs/gcc/4.9.2/include/c++/4.9.2/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/4.9.2/include/c++/4.9.2/thread: _M_start_thread(__shared_base_type); 

$ fgrep -r M_start_thread /usr/intel/pkgs/gcc/5.2.0/include/ 
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread:  _M_start_thread(_M_make_routine(std::__bind_simple(
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread: _M_start_thread(__shared_base_type, void (*)()); 
/pkgs/gcc/5.2.0/include/c++/5.2.0/thread: _M_start_thread(__shared_base_type); 
+0

ОК, это может быть так. Полагаю, когда я создаю Box2D, он использует несколько разных заголовков/библиотек, чем когда я создаю свое приложение, которое ссылается на него. Как я могу определить, какие из них он использует, и как я могу его контролировать? Это может быть специфично для используемой системы сборки (cmake), но, возможно, есть еще одно общее решение (например, удаление всей системы с одной версией заголовков/библиотек из системы?) –

+0

Я проверил систему, у меня есть только 4.9.2, включая файлы и 4.8 и 4.9. Ни libs не содержат необходимой перегрузки. Как возможно, что заголовки содержат ссылку на него, если это не в библиотеках? –