我在 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
得到解决(即我将 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/