提问人:Bogdan Ionitza 提问时间:7/6/2016 最后编辑:Bogdan Ionitza 更新时间:7/6/2016 访问量:10658
获取对 std::thread::_M_start_thread 的未定义引用
Getting undefined reference to 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>)
但此重载不采用第二个参数。
我已经在互联网上搜索了类似的东西,但以前似乎没有人遇到过这个问题(在任何情况下)。
关于我为什么会遇到这个错误以及如何解决它的任何提示?
答:
3赞
n. m. could be an AI
7/6/2016
#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赞
Bogdan Ionitza
7/7/2016
好吧,可能是这种情况。我想当我构建 Box2D 时,它使用一些与我构建链接到它的应用程序时不同的标头/库。我怎样才能知道它使用了哪些,我怎样才能控制它?这可能特定于它使用的构建系统(cmake),但也许有一些更通用的解决方案(例如从系统中删除除一个版本之外的所有标头/库?
0赞
Bogdan Ionitza
7/7/2016
我检查了系统,我只有 4.9.2 包含文件以及 4.8 和 4.9 库。这两个库都不包含所需的重载。如果它不在库中,标头怎么可能包含对它的引用?
评论
-pthread
-lpthread