Вопрос по multithreading, c++, g++, undefined-reference, ld – Получение неопределенной ссылки на std :: thread :: _ M_start_thread

2

Я создаю приложение, которое использует стороннюю библиотеку (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>)

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

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

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

Я упомянул использование-ptthread для компиляцииа также сшивание. πάντα ῥεῖ
Какой твойполный  команда связи? n.m.
@ πάνταῥεῖ попробовал это прямо сейчас, я получаю точно такую ​​же ошибку Bogdan Ionitza
Я изменил libs в другом порядке, но получил тот же результат Bogdan Ionitza

Ваш Ответ

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);
Я проверил систему, у меня есть только 4.9.2 включаемые файлы и 4.8 и 4.9 библиотеки. Ни одна из библиотек не содержит необходимой перегрузки. Как это возможно, что заголовки содержат ссылку на него, если он не в библиотеках? Bogdan Ionitza
хорошо, это может быть так. Я предполагаю, что когда я собираю Box2D, он использует несколько других заголовков / библиотек, чем когда я создаю свое приложение, которое ссылается на него. Как я могу сказать, какие из них он использует, и как я могу его контролировать? Это может быть специфично для используемой системы сборки (cmake), но может быть есть более общее решение (например, удаление всех, кроме одной версии заголовков / библиотек из системы?) Bogdan Ionitza

Похожие вопросы