c++ - 获取对 std::thread::_M_start_thread 的 undefined reference

标签 c++ multithreading g++ ld undefined-reference

我正在构建一个应用程序,它使用我从源代码构建的第 3 方库 (Box2D-MT)。链接时,出现 undefined reference 错误:

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>)

但是这个重载没有第二个参数。

我在整个互联网上搜索了类似的东西,但之前似乎没有人遇到过这个问题(在任何情况下)。

关于为什么我会收到此错误以及如何解决它的任何提示?

最佳答案

看起来头文件/库版本不匹配。这是我得到的:

$ 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);

关于c++ - 获取对 std::thread::_M_start_thread 的 undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38226993/

相关文章:

c++ - 多个 fork 不起作用

c++ - 我的 C++ 程序中的单例

我可以在多线程(pthreads)应用程序中捕获 SIGSEGV 和其他信号并打印导致它的线程或所有线程的回溯吗?

c++ - 在 Xcode 4 中使用 ccache

linux - 在 Linux 上使用静态链接构建应用程序是否明智?

c++ - 单例使用模板并调用析构函数

c++ - Windows XP 上的 OpenCV GetTickCount64 错误

swift - 数组默认按值传递&线程安全

Java线程不共享静态数据

c++ - qmake:处理 gcc 和 msvc 的选项