2.2. GNU C++ Compiler
2.2.1. 安装 C++ 编译器 复制链接链接已复制到粘贴板!
在 Red Hat Developer Toolset 中,GNU C++ 编译器由 devtoolset-9-gcc-c++ 软件包提供,并自动安装 devtoolset-9-toolchain 软件包,如 第 1.5 节 “安装 Red Hat Developer Toolset” 所述。
2.2.2. 使用 C++ Compiler 复制链接链接已复制到粘贴板!
要在命令行上编译 C++ 程序,请运行 g++ 编译器,如下所示:
scl enable devtoolset-9 'g++ -o output_file source_file...'
$ scl enable devtoolset-9 'g++ -o output_file source_file...'
这会在当前工作目录中创建一个名为 output_file 的二进制文件。如果省略了 -o 选项,g++ 编译器默认创建名为 a.out 的文件。
当您处理由多个源文件组成的项目时,首先编译每个源文件的对象文件,然后将这些目标文件链接在一起。这样,当您更改单个源文件时,您只能编译此文件,而无需编译整个项目。在命令行中编译目标文件:
scl enable devtoolset-9 'g++ -o object_file -c source_file'
$ scl enable devtoolset-9 'g++ -o object_file -c source_file'
这会创建一个名为 object_file 的对象文件。如果省略了 the -o 选项,g++ 编译器将使用 .o 文件扩展名创建以源文件命名的文件。将目标文件链接在一起并创建二进制文件:
scl enable devtoolset-9 'g++ -o output_file object_file...'
$ scl enable devtoolset-9 'g++ -o output_file object_file...'
请注意,您可以使用 scl 工具执行任何命令,从而导致它使用等效的 Red Hat Developer Toolset 二进制文件来运行它。这可让您默认使用 Red Hat Developer Toolset g++ 运行 shell 会话:
scl enable devtoolset-9 'bash'
$ scl enable devtoolset-9 '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-9 'g++ -o hello hello.cpp'
$ scl enable devtoolset-9 '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 以及来自 Red Hat Developer Toolset 版本 1、2、3、4 和 6 的所有编译器都与 C++98 模式中的任何其他编译器兼容。
C++11 或 C++14 模式中的编译器只保证在 C++11 或 C++14 模式中与另一个编译器兼容(例如,来自 Red Hat Developer Toolset 6.x)。
- Red Hat Developer Toolset 7.x 和 8.x 中的编译器可以使用 C++17 构建代码,但此功能是实验性的,不受红帽支持。
- 本节中提到的所有兼容性信息只与 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 的默认语言标准设置为带有 GNU 扩展的 C++14,相当于明确使用 option -std=gnu++14。
当使用相应标志编译的所有 C++ 对象使用 Red Hat Developer Toolset 6 或更高版本构建时,Red Hat Developer Toolset 中支持使用 C++14 语言版本。在 C++98 的默认模式中由 system GCC 编译的对象也兼容,但使用 C++11 或 C++14 模式下使用系统 GCC 编译的对象也不兼容。
只有在使用相应标志编译的所有 C++ 对象都使用相同的 GCC 主版本构建时,在 Red Hat Developer Toolset 中使用 C++17 语言版本是实验性的。因为 Red Hat Developer Toolset 的后续主版本可以使用 GCC 的后续主要版本,所以无法保证使用 -std=c++17 和 -std=gnu++17 选项构建的对象、二进制文件和库的兼容性。
在应用程序中使用 C++11 和 C++14 功能需要仔细考虑上述 ABI 兼容性信息。
使用 Red Hat Enterprise Linux 7 system toolchain GCC 使用 -std=c++0x or -std=gnu++0x 标志构建的对象、二进制文件和库(使用 Red Hat Developer Toolset 中的 GCC 构建)时,明确不支持使用 Red Hat Developer Toolset 中的 GCC 构建的对象、二进制文件和库。
除了上述 C++11 和 C++14 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 选项。