我在Ubuntu 16.04(g ++ 5.4)上收到了我不明白的C ++构建错误:
链接器错误(采用其中一些并通过c++filt
运行)
undefined reference to symbol 'std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const@@GLIBCXX_3.4'
undefined reference to symbol 'std::condition_variable::notify_one()@@GLIBCXX_3.4.11'
我正在使用的命令是:gcc -std=c++11 -m64 -fPIC -std=c++11 ...
(...包含所有库,等。)
我认为我试图链接/usr/lib/x86_64-linux-gnu/libstdc++.so.6
。当我针对它strings
运行时,我会看到GLIBCXX_3.4
和GLIBCXX_3.4.11
(但我真的不知道这表明了什么。)
nm向我显示符号(至少定义了condition_variable
)
$ nm -DA /usr/lib/x86_64-linux-gnu/libstdc++.so.6 | c++filt | grep condition_variable::notify_one
/usr/lib/x86_64-linux-gnu/libstdc++.so.6:00000000000b3930 T std::condition_variable::notify_one()
我在尝试链接的所有库上运行readelf
,并且它们似乎都是为同一个ABI(GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609
)构建的
我注意到第一个错误是通过显式链接libstd++.so
(即。我在CMake中添加stdc++
到我的target_link_libraries
来解决的。我的印象是我永远不应该这样做?
答案 0 :(得分:1)
g++
而非gcc
以避免此问题(基于@ SergeyA的评论)
GCC的行为会有所不同,具体取决于您是以gcc
还是g++
二进制文件运行它。具体来说,它显然不会自动链接到其捆绑的C ++标准库libstdc++
。我猜它会链接到它的C标准库 - 这对你没有多大帮助。
所以只需为您的语言使用适当的二进制文件;指定--std=c++whatever
是不够的。