c++ - GCC 没有链接到 libstdc++?

标签 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 得到解决(我将 stdc++ 添加到我的 target_link_libraries 在 CMake 中)。我的印象是我永远不必这样做?

最佳答案

tl;dr: 调用 g++ 而不是 gcc 来避免这个问题

(基于@SergeyA 的评论)

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

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

关于c++ - GCC 没有链接到 libstdc++?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49242829/

相关文章:

c++ - 在 Mac OS X 上以多态方式捕获 -fno-rtti 共享库中的异常

c++ - : Insert pair into multimap, 其中一种类型如何是抽象的?

c# - .Net 中的元素如何存储在容器中?

C++ 函数参数按值传递

c++ - 在 VS C++ 6.0 中,什么调试工具可以很好地查找内存泄漏的位置?

c++ - GCC 发出的 vtable 汇编代码中的那两个 long 是什么?

c++ - gcc是否将非常量表达式函数的内置函数视为常量表达式

c++ - 通过宏定义编译标志(C++11 和优化)

c++ - 如何在 sublime 构建文件中添加双引号?

g++ - LD:与STL库链接