Получение неопределенной ссылки на std::thread::_M_start_thread
Я создаю приложение, которое использует стороннюю библиотеку (Box2D-MT), которую я создаю из исходников. При связывании я получаю эту неопределенную ошибку ссылки:
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 (*)())'
Я строю с g++ и ссылку с
-lBox2D -lpthread -lrt -ldl -lstdc++
Кроме того, я собираю с
-std=c++11
заглядывая в libstdC++.a я вижу похожий этот символ существует (это "T"):
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>)
но эта перегрузка не принимает второй параметр.
Я искал во всем Интернете что-то похожее, но никто, похоже, не сталкивался с этой проблемой раньше (ни в каком контексте).
Любой намек на то, почему я получаю эту ошибку и как я могу ее решить?
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);