Red Hat Training

A Red Hat training course is available for RHEL 8

4.5. GCC Toolset 12

了解特定于 GCC Toolset 版本 12 以及此版本中包含的工具的信息。

4.5.1. GCC Toolset 12 提供的工具和版本

GCC Toolset 12 提供以下工具和版本:

表 4.4. GCC Toolset 12 中的工具版本

Name版本描述

GCC

12.1.1

便携式编译器套件,支持 C、C++ 和 Fortran。

GDB

11.2

命令行调试器,适用于使用 C、C++ 和 Fortran 编写的程序。

binutils

2.38

一组二进制工具和其他实用程序,用于检查和操作对象文件和二进制文件。

dwz

0.14

用于优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具。

annobin

10.76

构建安全检查工具.

4.5.2. GCC Toolset 12 中的 C++ 兼容性

重要

这里给出的兼容性信息只适用于 GCC Toolset 12 中的 GCC。

GCC Toolset 中的 GCC 编译器可以使用以下 C++ 标准:

C++14

这个语言标准包括在 GCC Toolset 12 中。

当使用 GCC 版本 6 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++14 语言版本。

C++11

这个语言标准包括在 GCC Toolset 12 中。

当使用 GCC 版本 5 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++11 语言版本。

C++98
这个语言标准包括在 GCC Toolset 12 中。通过使用 GCC Toolset、Red Hat Developer Toolset 以及 RHEL 5、6、7 和 8 的 GCC 构建二进制文件、共享库和对象,都可以自由混合。
C++17

这个语言标准包括在 GCC Toolset 12 中。

这是 GCC Toolset 12 的默认语言标准设置,它相当于使用 -std=gnu++17 选项进行显式使用。

当使用 GCC 版本 10 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++17 语言版本。

c++20 和 C++23

这个语言标准只在 GCC Toolset 12 中作为实验性、不稳定和不受支持的功能提供。此外,还无法保证使用此标准构建的对象、二进制文件和库的兼容性。

要启用 C++20 支持,请将命令行选项 -std=c++20 添加到 g++ 命令行。

要启用 C++23 支持,请在 g++ 命令行中添加命令行选项 -std=c++23

所有语言标准均可在符合标准的变体或 GNU 扩展中找到。

将与 GCC Toolset 构建的对象与通过 RHEL 工具链构建的对象(particularly. o 或. a 文件)混合时,应将 GCC Toolset 工具链用于任何链接。这可确保任何仅由 GCC Toolset 提供的更新库功能在链接时得以解决。

4.5.3. GCC Toolset 12 中的 GCC 的具体信息

库的静态链接

某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。

重要

由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。

在链接时在对象文件后指定库

在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:

$ scl enable gcc-toolset-12 'gcc -lsomelib objfile.o'

以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:

$ scl enable gcc-toolset-12 'gcc objfile.o -lsomelib'

请注意,在使用基本 Red Hat Enterprise Linux 的 GCC 版本时,这个建议也适用。

4.5.4. GCC Toolset 12 中 binutils 的细节

库的静态链接

某些较新的库功能已静态链接到使用 GCC 工具集构建的应用程序中,以支持在多个版本的 Red Hat Enterprise Linux 中执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。

重要

由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。

在链接时在对象文件后指定库

在 GCC Toolset 中,库使用链接器脚本链接,这些脚本可能通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:

$ scl enable gcc-toolset-12 'ld -lsomelib objfile.o'

以这种方式使用 GCC Toolset 中的库会导致 未定义引用的 符号链接器错误消息。要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:

$ scl enable gcc-toolset-12 'ld objfile.o -lsomelib'

请注意,在使用基本 Red Hat Enterprise Linux 的 binutils 版本时,这个建议也适用。

4.5.5. GCC Toolset 12 中 annobin 的细节

在某些情况下,由于 GCC Toolset 12 中的 annobingcc 之间的同步问题,您的编译可能会失败,并显示类似如下的错误消息:

cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin/gcc-annobin.so
expanded from short plugin name gcc-annobin: No such file or directory

要临时解决这个问题,请从 annobin.so 文件中创建一个符号链接到 gcc-annobin.so 文件中:

# cd /opt/rh/gcc-toolset-12/root/usr/lib/gcc/architecture-linux-gnu/12/plugin
# ln -s annobin.so gcc-annobin.so

使用您系统中使用的构架替换 architecture

  • aarch64
  • i686
  • ppc64le
  • s390x
  • x86_64