2.2.4. c++ 兼容性
所有 Red Hat Enterprise Linux 版本 5、6 和 7 以及 Red Hat Developer Toolset 版本 1 到 10 的所有编译器均与 C++98 模式中的任何其他编译器兼容。
C++11、C++14 或 C++17 模式中的编译器只能保证在同一模式下与另一编译器兼容。
支持的示例:
- Red Hat Developer Toolset 6.x 中的 C++11 和 C++11
- Red Hat Developer Toolset 6.x 中的 C++14 和 C++14
- 来自 Red Hat Developer Toolset 10.x 的 C++17 和 C++17
- Red Hat Developer Toolset 10.x 中的 GCC 编译器可以使用 C++20 构建代码,但这个功能是实验性的,且不受红帽支持。
- 本节所述的所有兼容性信息都仅适用于 GCC C++ 编译器的红帽版本。
2.2.4.1. C++ ABI
使用 -std=c++98
或 -std=gnu++98 或 -std=gnu++98
可自由混合使用 Red Hat Enterprise Linux 5、6 或 7 系统 GCC 构建的、与 Red Hat Developer Toolset 工具链构建的 C++98 的二进制文件或库。
Red Hat Developer Toolset 11.0 的默认语言标准设置是 C++17,具有 GNU 扩展,相当于使用选项 -std=gnu++17
。
当使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本,所有使用相应标志编译的 C++ 对象。C++98 中由系统 GCC 编译的对象也兼容,但在 C++11 或 C++14 模式中,使用系统 GCC 编译的对象不兼容。
从 Red Hat Developer Toolset 10.x 开始,使用 C++17 语言版本不再是实验性的,由红帽提供支持。所有使用 C++17 编译的 C++ 对象必须使用 Red Hat Developer Toolset 10.x 或更高版本构建。
使用应用程序中的 C++11、C++14 和 C++17 功能需要仔细考虑上述 ABI 兼容性信息。
使用 Red Hat Developer Toolset 中的 GCC 明确支持由 Red Hat Enterprise Linux 7 系统工具chain GCC 构建的对象、二进制文件和库的组合。
除了上面讨论的 C++11、C++14 和 C++17 ABI 外,Red Hat Enterprise Linux 应用程序兼容性规范 不会改变用于 Red Hat Developer Toolset。当使用通过 Red Hat Enterprise Linux 7 工具链(一个 .o
/.a
文件)构建的 Red Hat Developer Toolset 工具链结合使用时,Red Hat Developer Toolset 工具链应用于任何链接。这样可确保只由 Red Hat Developer Toolset 提供的更新库功能会在链接时解析。
添加了一个新的标准控制 SIMD vector 类型,以避免在有向量不同长度的系统中进行名称冲突。Red Hat Developer Toolset 中的编译器默认使用新的 mangling。通过在 GCC C++ 编译器调用中添加 -fabi-version=2
或 -fabi-version=3
选项,可以使用前面的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi
选项。
在 Red Hat Enterprise Linux 7 中,GCC C++ 编译器默认仍然使用旧的 mangling,但会在支持强大别名的目标上发送别名。通过将 -fabi-version=4
选项添加到编译器调用,可以使用新的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi
选项。
在 Red Hat Enterprise Linux 7 中,Red Hat Developer Toolset 中的 GCC C++ 编译器仍然使用 std::string
的旧参考计数实现。这是为了与 Red Hat Enterprise Linux 7 系统工具chain GCC 的兼容性。这意味着,即使使用 Red Hat Developer Toolset 编译器也是如此,即使使用 Red Hat Developer Toolset 编译器也会提供一些新的 C++17 功能,如 std::pmr::string
也是如此。