4.2. GCC Toolset 12
了解特定于 GCC Toolset 版本 12 的信息以及此版本中包含的工具。
4.2.1. GCC Toolset 12 提供的工具和版本
GCC Toolset 12 提供以下工具和版本:
Name | 版本 | 描述 |
---|---|---|
GCC | 12.2.1 | 可移植编译器套件,支持 C、C++ 和 Fortran。 |
GDB | 11.2 | 对使用 C、C++ 和 Fortran 编写的程序的命令行调试器。 |
binutils | 2.38 | 用于检查和操作对象文件和二进制文件的二进制工具集合。 |
dwz | 0.14 | 可优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具,以获得大小。 |
annobin | 11.08 | 构建安全检查工具。 |
4.2.2. GCC Toolset 12 中的 C++ 兼容性
这里给出的兼容性信息只适用于 GCC Toolset 12 中的 GCC。
GCC Toolset 中的 GCC 编译器可使用以下 C++ 标准:
- C++14
这个语言标准包括在 GCC Toolset 12 中。
当使用相应标志编译的所有 C++ 对象使用 GCC 版本 6 或更高版本构建时,支持使用 C++14 语言版本。
- C++11
这个语言标准包括在 GCC Toolset 12 中。
当使用相应标志编译的所有 C++ 对象使用 GCC 版本 5 或更高版本构建时,支持使用 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
选项。当使用相应标志编译的所有 C++ 对象使用 GCC 版本 10 或更高版本构建时,支持使用 C++17 语言版本。
- c++20 和 C++23
这个语言标准在 GCC Toolset 12 中提供,但应视为是实验性的、不稳定和不受支持的功能。另外,无法保证使用此标准构建的对象、二进制文件和库的兼容性。
要启用 C++20 支持,请在 g++ 命令行中添加命令行选项
-std=c++20
。要启用 C++23 支持,请在 g++ 命令行中添加命令行选项
-std=c++23
。
所有语言标准均有标准兼容变体和 GNU 扩展。
当使用 GCC Toolset 和这些 RHEL 工具链(特别是 .o
或 .a
文件)混合对象构建时,GCC Toolset 工具链应该用于所有链接。这样可确保仅由 GCC Toolset 提供的较新的库功能在链接时得以解决。
4.2.3. GCC Toolset 12 中的 GCC 的具体信息
库的静态链接
某些最新的库功能被静态链接到使用 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误没有改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可通过静态归档指定某些符号。这是为了确保与多个 Red Hat Enterprise Linux 版本兼容所必需的。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
$ scl enable gcc-toolset-12 'gcc -lsomelib objfile.o'
以这种方式使用 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol
。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
$ scl enable gcc-toolset-12 'gcc objfile.o -lsomelib'
请注意,这个建议也适用于使用 GCC 的基本 Red Hat Enterprise Linux 版本。
4.2.4. GCC Toolset 12 中的 binutils 的具体信息
库的静态链接
某些最新的库功能被静态链接到使用 GCC Toolset 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误没有改变这个代码。如果因这个风险开发人员需要重建其应用程序,红帽将使用一个安全勘表进行沟通。
由于这个额外的安全风险,强烈建议开发人员不要静态地将整个应用程序链接在一起。
在进行链接时,在对象文件后指定库
在 GCC Toolset 中,库使用 linker 脚本链接,这些脚本可通过静态归档指定某些符号。这是为了确保与多个 Red Hat Enterprise Linux 版本兼容所必需的。但是,链接器脚本使用对应的共享对象文件的名称。因此,linker 使用不同于预期的符号处理规则,在指定程序库选项前不识别对象文件所需的符号:
$ scl enable gcc-toolset-12 'ld -lsomelib objfile.o'
以这种方式使用 GCC Toolset 的库会导致 linker 错误消息 undefined reference to symbol
。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库:
$ scl enable gcc-toolset-12 'ld objfile.o -lsomelib'
请注意,这个建议也适用于使用 binutils 的基本 Red Hat Enterprise Linux 版本。
4.2.5. GCC Toolset 12 中的 annobin 的具体内容
在某些情况下,由于 GCC Toolset 12 中的 annobin
和 gcc
之间的同步问题,您的编译可能会失败,并显示类似如下的错误消息:
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