2.2. GNU C++ Compiler
2.2.1. 安装 C++ 编译器 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU C++ 编译器由 devtoolset-11-gcc-c++ 软件包提供,并自动安装 devtoolset-11-toolchain 软件包,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.2.2. 使用 C++ Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C++ 程序,请运行 g++ 编译器,如下所示:
scl enable devtoolset-11 'g++ -o output_file source_file...'
$ scl enable devtoolset-11 'g++ -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,g++ 编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-11 'g++ -o object_file -c source_file'
$ scl enable devtoolset-11 'g++ -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,g++ 编译器将使用 .o 文件扩展名创建以源文件命名的文件。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-11 'g++ -o output_file object_file...'
$ scl enable devtoolset-11 'g++ -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset g++ 运行 shell 会话:
scl enable devtoolset-11 'bash'
$ scl enable devtoolset-11 'bash'
验证您在任何时候使用的 g++ 版本:
which g++
$ which g++
Red Hat Developer Toolset 的 g++ 可执行路径以 /opt 开头。另外,您可以使用以下命令确认版本号与 Red Hat Developer Toolset g++ 的版本号匹配:
g++ -v
$ g++ -v
例 2.3. 在命令行中编译 C++ 程序
考虑一个名为 hello.cpp 的源文件,其内容如下:
在命令行中使用 Red Hat Developer Toolset 中的 g++ 编译器编译此源代码:
scl enable devtoolset-11 'g++ -o hello hello.cpp'
$ scl enable devtoolset-11 'g++ -o hello hello.cpp'
这会在当前工作目录中创建一个名为 hello 的新二进制文件。
2.2.3. 运行 C++ 程序 复制链接链接已复制到粘贴板!
当 g++ 编译程序时,它会创建一个可执行文件。要在命令行中运行程序,请切换到具有可执行文件的目录,并运行以下命令:
./file_name
$ ./file_name
例 2.4. 在命令行中运行 C++ 程序
假设您已成功编译了 hello 二进制文件,如 例 2.3 “在命令行中编译 C++ 程序” 所示,您可以运行它:
./hello
$ ./hello
Hello, World!
2.2.4. C++ 兼容性 复制链接链接已复制到粘贴板!
来自 Red Hat Enterprise Linux 版本 5、6 和 7 以及从 any -std 模式中的 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 复制链接链接已复制到粘贴板!
由 Red Hat Developer Toolset 工具明确使用 -std=c++98 or-std=gnu++98 或 -std=gnu++98 构建的任何 C++98 兼容二进制文件或库都可以自由地混合使用 Red Hat Enterprise Linux 5、6 或 7 系统 GCC 构建的二进制文件和共享库。
Red Hat Developer Toolset 11.0 的默认语言标准设置为带有 GNU 扩展的 C++17,相当于明确使用 option -std=gnu++17。
当使用相应标志编译的所有 C++ 对象使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本。在 C++98 的默认模式中由 system 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 使用 -std=c++0x 或 -std=gnu++0x 标记构建的对象、二进制文件和库(由 Red Hat Developer Toolset 中的 GCC 使用 C++11 或更高版本构建的语言版本)被明确不被支持。
除了上述 C++11、C++14 和 C++17 ABI 外,Red Hat Enterprise Linux 应用程序兼容性规格 对 Red Hat Developer Toolset 不会改变。当使用 Red Hat Developer Toolset 与 Red Hat Developer Toolset 构建的对象与 Red Hat Enterprise Linux 7 工具链(特别是 .o/.a 文件)一起构建时,Red Hat Developer Toolset 工具链应该用于任何链接。这样可确保只有 Red Hat Developer Toolset 提供的较新的库功能在链接时被解决。
添加了用于 SIMD 向量类型的新标准手册,以避免在具有不同长度的系统上出现名称冲突。Red Hat Developer Toolset 中的编译器默认使用新的 mangling。通过在 GCC C++ 编译器调用中添加 -fabi-version=2 或 -fabi-version=3 选项,可以使用前面的标准 mangling。要显示使用旧 mangling 的代码的警告,请使用 -Wabi 选项。
在 Red Hat Enterprise Linux 7 中,GCC C++ 编译器默认使用旧的 mangling,但使用新的 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 系统工具链 GCC 的兼容性。这意味着,在 Red Hat Enterprise Linux 7 中不提供一些新的 C++17 功能,如 std::pmr::string,即使在使用 Red Hat Developer Toolset 编译器时也是如此。