4.8. GCC Toolset 15
Red Hat Enterprise Linux 中的 GCC Toolset 15 为 C、C++ 和 Fortran 提供了更新的编译器和调试器。它支持通过当前功能构建、测试和优化应用程序,同时保持系统稳定性和支持。
4.8.1. GCC Toolset 15 工具和版本 复制链接链接已复制到粘贴板!
GCC Toolset 15 提供了在 RHEL 上构建和调试应用程序的开发工具的更新版本。
| Name | 版本 | 描述 |
| GCC | 15.1.1 | 便携式编译器套件,支持 C、C++ 和 Fortran。 |
| GDB | 16.3 | 命令行调试器,适用于使用 C、C++ 和 Fortran 编写的程序。 |
| binutils | 2.44 | 一组二进制工具和其他实用程序,用于检查和操作对象文件和二进制文件。 |
| annobin | 12.93 | 构建安全检查工具. |
| dwz | 0.16 | 用于优化 ELF 共享库和 ELF 可执行文件中包含的 DWARF 调试信息的工具。 |
4.8.2. GCC Toolset 15 中的 C++ 兼容性 复制链接链接已复制到粘贴板!
GCC Toolset 15 支持一系列 C++ 语言标准。默认标准是 C++17,但您可以选择其他选项,如 C++98、C++11、C++14 或实验性版本,包括 C++20、C++23 和 C++26。要选择其他标准,请在构建代码时使用适当的编译器标志。
这个兼容性信息只适用于 GCC Toolset 15 中的 GCC。
GCC Toolset 15 中的 GCC 编译器可使用以下 C++ 标准:
- C++98
- 这个语言标准包括在 GCC Toolset 15 中。使用这个标准构建的二进制文件、共享库和对象可以自由混合,无论是否使用 GCC Toolset 15、Red Hat Developer Toolset 和 RHEL 5、6、7 和 8 的 GCC 构建。
- C++11
- 这个语言标准包括在 GCC Toolset 15 中。
- C++14
这个语言标准包括在 GCC Toolset 15 中。
当使用 GCC 版本 6 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++14 语言版本。
- C++17
这个语言标准包括在 GCC Toolset 15 中。
这是 GCC Toolset 15 的默认语言标准设置,它相当于明确使用 option
-std=gnu++17。当使用 GCC 版本 10 或更高版本构建了使用相应标记编译的所有 C++ 对象时,支持使用 C++17 语言版本。
- C++20 和 C++23, 和 C++26
这些语言标准在 GCC Toolset 15 中仅作为实验性、不稳定和不受支持的功能提供。另外,无法保证使用这些标准构建的对象、二进制文件和库的兼容性。
要启用 C++20 标准,请在 g++ 命令行中添加命令行选项
-std=c++20。要启用 C++23 标准,请在 g++ 命令行中添加命令行选项
-std=c++23。要启用 C++26 标准,请在 g++ 命令行中添加命令行选项
-std=c++26。所有语言标准均可在符合标准的变体或 GNU 扩展中找到。
当您将构建的对象与利用系统工具链 .o 或 .a 文件构建的 GCC Toolset 15 和对象结合时,使用 GCC Toolset 15 进行链接。这样可确保仅在链接时由 GCC Toolset 15 提供的较新的库功能解决。
4.8.3. GCC Toolset 15 中的 GCC 的具体信息 复制链接链接已复制到粘贴板!
- 库的静态链接
- 某些最新的库功能被静态链接到使用 GCC Toolset 15 构建的应用程序,以支持在多个 Red Hat Enterprise Linux 版本上执行。这会产生另外一个小的安全风险,因为标准的 Red Hat Enterprise Linux 勘误表不会改变这个代码。如果开发人员出于此风险而需要重建其应用,红帽将使用安全勘误对此进行沟通。
由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。
- 在链接时在对象文件后指定库
在 GCC Toolset 15 中,库使用 linker 脚本链接,它们可以通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:
$ scl enable gcc-toolset-15 'gcc -lsomelib objfile.o'以这种方式使用 GCC Toolset 15 的库会导致 linker 错误消息
undefined reference to symbol。要防止这个问题,请按照标准链接实践操作,并在指定对象文件的选项后添加库来指定选项:$ scl enable gcc-toolset-15 'gcc objfile.o -lsomelib'请注意,这个建议也适用于使用 GCC 的基本 Red Hat Enterprise Linux 版本。
4.8.4. GCC Toolset 15 中的 binutils 的具体信息 复制链接链接已复制到粘贴板!
- 库的静态链接
- GCC Toolset 15 静态将较新的库功能链接到应用程序中,以确保在多个 Red Hat Enterprise Linux 版本间的兼容性。静态链接的代码可能会带来较小的安全风险,因为安全更新需要重新构建应用程序。如果发现安全漏洞,红帽会通知开发人员通过安全公告重建受影响的应用程序。
由于这种额外的安全风险,开发人员强烈建议不要出于相同的原因将整个应用程序静态链接。
- 在链接时在对象文件后指定库
在 GCC Toolset 15 中,库使用 linker 脚本链接,这些脚本可以通过静态存档指定一些符号。这需要确保与红帽企业 Linux 的多个版本兼容。但是,链接器脚本使用对应共享对象文件的名称。因此,链接器使用与预期不同的符号处理规则,在指定对象文件选项前,在指定对象文件选项前不会识别对象文件所需的符号:
$ scl enable gcc-toolset-15 'ld -lsomelib objfile.o'以这种方式使用 GCC Toolset 15 的库会导致 linker 错误消息
undefined reference to symbol。要防止这个问题,请遵循标准链接实践,并在指定对象文件的选项后指定添加库的选项:$ scl enable gcc-toolset-15 'ld objfile.o -lsomelib'请注意,这个建议也适用于使用 binutils 的基本 Red Hat Enterprise Linux 版本。
4.8.5. GCC Toolset 15 中的 annobin 的具体内容 复制链接链接已复制到粘贴板!
在某些情况下,由于 GCC Toolset 15 中的 annobin 和 gcc 之间的同步问题,您的编译可能会失败,并显示类似如下的错误消息:
cc1: fatal error: inaccessible plugin file
opt/rh/gcc-toolset-15/root/usr/lib/gcc/_architecture_-linux-gnu/15/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-15/root/usr/lib/gcc/architecture-linux-gnu/15/plugin创建符号链接:
$ ln -s annobin.so gcc-annobin.so
使用您的系统中使用的构架替换 architecture :
-
aarch64 -
i686 -
ppc64le -
s390x -
x86_64