GCC没有链接libstdc ++?

时间:2018-03-12 19:10:45

标签: c++ gcc g++ linker-errors

我在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.4GLIBCXX_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来解决的。我的印象是我永远不应该这样做?

1 个答案:

答案 0 :(得分:1)

tl; dr:调用g++而非gcc以避免此问题

(基于@ SergeyA的评论)

GCC的行为会有所不同,具体取决于您是以gcc还是g++二进制文件运行它。具体来说,它显然不会自动链接到其捆绑的C ++标准库libstdc++。我猜它会链接到它的C标准库 - 这对你没有多大帮助。

所以只需为您的语言使用适当的二进制文件;指定--std=c++whatever是不够的。