GCC 没有链接到 libstdc++?

GCC not linking against libstdc++?

我在 Ubuntu 16.04 (g++ 5.4) 上收到我不理解的 C++ 构建错误:

linker 错误是(采取了其中的一些,然后 运行 通过 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 ...(...有所有的库,等等

我假设我正在尝试 link 反对 /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 我尝试 link 的所有库,它们似乎都是为相同的 ABI 构建的(GCC: (Ubuntu 5.4.0-6ubuntu1~16.04.9) 5.4.0 20160609 )

更新

我注意到第一个错误通过显式 linking 反对 libstd++.so 得到解决( 我将 stdc++ 添加到我的 target_link_libraries 在 CMake 中)。我的印象是我永远不必这样做?

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

(基于@SergeyA 的评论)

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

因此,只需使用适合您的语言的二进制文件即可;指定 --std=c++whatever 是不够的。