c++ - gcc 使用 c++11 标准,即使 98 明确指定

标签 c++ c++11 gcc c++98

我收到一个奇怪的错误,我怀疑与我的系统配置有关。我正在使用 g++ --version = g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609 编译/链接一个简单的 C++ 程序。 默认语言标准记录为 c++98,但即使指定了 -std=c++98 选项,我在输出 .o 文件中看到了 c++11 符号。这是我的测试.cpp:

#include <string>
int main() {
  std::string str = "Hello World!";
  return 0;
}

这是我的编译和链接命令(可能带有不必要的显式语言标准选项)和相关输出:

$ g++ -c -Wall -std=c++98 -o test.o test.cpp
$ g++ -Wall -std=c++98 -o test test.o
$ nm -C test.o
                 U __gxx_personality_v0
0000000000000000 T main
                 U __stack_chk_fail
                 U _Unwind_Resume
                 U std::allocator<char>::allocator()
                 U std::allocator<char>::~allocator()
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::basic_string(char const*, std::allocator<char> const&)
                 U std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >::~basic_string()

请注意对 __cxx11::* 的引用。我认为这些是编译器插入的 c++11 符号。我获得了成功的构建,但显然使用的是 c++11。这是 ldd 的输出:

$ ldd test
    linux-vdso.so.1 =>  (0x00007ffc381f5000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6548d48000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6548b32000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6548768000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f654845f000)
    /lib64/ld-linux-x86-64.so.2 (0x000055785493c000)

对于我的真实项目,我必须链接到 c++98 的第三方库,但由于此编译器问题而无法这样做。我的目标文件正在这些库中查找 c++11 符号,但找不到它们。有什么见解吗?

最佳答案

如上所述here ,libstdc++ v.6 支持新旧 ABI。我必须放置

-D_GLIBCXX_USE_CXX11_ABI=0

到 Makefile 的 g++ 命令。这解决了库不兼容的问题。

关于c++ - gcc 使用 c++11 标准,即使 98 明确指定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42514202/

相关文章:

c++ - C++ 基于范围的循环在内部是如何工作的

c++ - GCC:对未使用的函数的奇怪未解决引用

c++ - 套接字编程中非法查找的可能原因

C++文件输入输出:cannot input

c++ - 空字符行为 C++

C++ Boost 线程。如何使用递归尝试锁?死锁发生在并发代码中

c++ - 重载函数作为可变参数模板函数的参数

c++ - 基于模板参数推导利用的 STL 算法名称可解析或未定义

c - 警告 : format ‘%s’ expects type ‘char *’ , 但参数 2 的类型为 ‘int’

linux - 为什么编译器添加额外的 'sxtw' 指令(进一步导致内核 panic )?