即使明确指定了98个标准,GCC也使用C 11标准

  • 本文关键字:标准 GCC 98个 c++ c++11 gcc c++98
  • 更新时间 :
  • 英文 :


我遇到了一个奇怪的错误,我怀疑与系统配置有关。我正在使用G = g++ (Ubuntu 5.4.0-6ubuntu1~16.04.4) 5.4.0 20160609编译/链接琐碎的C 程序。默认语言标准记录为C 98,但即使指定了-STD = C 98选项,我在输出.O文件中看到C 11符号。这是我的test.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的第三方Libs,但由于这个编译器问题而无法这样做。我的对象文件正在这些libs中寻找C 11个符号,但找不到它们。有任何见解?

如下所述,libstdc v.6支持新的和旧的ABI。我必须放置

-d_glibcxx_use_cxx11_abi = 0

到Makefile的G 命令。这照顾了自由li不兼容。

最新更新