HOWTO · C++

使用 GCC 编译 C++ 程序

本文讨论了一种使用 gcc 编译器编译 C++ 程序的方法。

本页内容

使用 GCC 编译并运行 C++ 源文件时,可通过 g++ 编译器驱动程序执行 g++ -o hello hello.cpp,然后在 Linux 或 macOS 上运行 ./hello。GCC 是 GNU Compiler Collection(GNU 编译器套件);对于普通程序,g++ 会选择 C++ 构建方式,其中包括链接 C++ 标准库。下文将介绍如何检查编译器是否可用、编写第一个程序、理解常见诊断信息,以及构建一个小型多文件程序。

了解 GCC 及其重要性

GCC 是一个包含多种语言编译器驱动程序的编译器套件。编写 C++ 程序时,通常选择 g++ 最简单。构建过程会将源代码转换为目标代码,再把目标代码和所需的库链接成可执行文件。单条构建命令可以完成这两个阶段;较大的项目则可能先分别编译各个文件,再进行链接。

gcc 驱动程序可以编译 C++ 源代码,但它不像 g++ 那样自动链接 C++ 标准库。在 GNU/Linux 工具链中,可以通过 gcc 配合 -lstdc++ 显式请求链接该库;库的顺序和平台细节可能会影响结果,因此日常构建 C++ 程序时建议使用 g++。源文件常用 .cpp 或 .cc 扩展名;在区分大小写的系统上,GCC 也会将大写 .C 扩展名视为 C++ 文件。

安装 GCC

首先在终端运行 g++ --version,检查系统是否已有可用的 C++ 编译器。如果找到了编译器,该命令会显示其版本。如果系统无法识别此命令,请使用操作系统的包管理器,或按照该系统推荐的工具链提供方的说明安装 C++ 工具链。软件包名称和安装步骤因系统而异;在 Ubuntu 和一些相关发行版中,build-essential 包含 GCC 及其他构建工具。在 Windows 上,可以安装 MinGW-w64 等 GCC 工具链,并将其 bin 目录添加到 PATH;也可以使用其他受支持的 C++ 工具链。请遵循发行版或工具链的当前安装说明,不要依赖旧示例中的版本号。

编写第一个 C++ 程序

在工作目录中创建一个名为 hello.cpp 的文件。下面的程序会向标准输出写入一行内容:

运行以下示例:

#include <iostream>

int main() {
    std::cout << "Hello, World!\n";
    return 0;
}
Hello, World!

#include <iostream> 提供了 std::cout 使用的流声明。main 函数是程序的入口点,\n 用于结束输出的这一行。

编译 C++ 程序

在包含 hello.cpp 的目录中,运行 g++ -o hello hello.cpp 进行编译并为可执行文件命名。-o 选项用于指定输出名称;如果不使用该选项,在许多类 Unix 系统上,GCC 会采用 a.out 这样的默认名称。生成的文件是可执行文件,而不是目标文件。在 Linux 或 macOS 上,使用 ./hello 运行它。在 Windows 命令提示符中,通常可以在当前目录运行 hello.exe;具体运行方式取决于所用的 shell 和工具链。

对于 GNU/Linux 环境,可以使用 gcc -o hello hello.cpp -lstdc++ 作为替代方案,显式请求链接 C++ 标准库。如果构建系统要求使用 gcc 驱动程序,这种方式可能会有用;但普通 C++ 程序更适合使用 g++,因为它会自动选择适当的 C++ 链接行为。

排查编译错误

从左到右阅读诊断信息:它会指出源文件和行号,然后描述问题。例如,如果程序使用了 cout,却没有包含 <iostream> 或写成 std::cout,诊断信息可能会指出 cout 未声明。添加缺少的头文件并使用 std::cout,然后重新构建。具体措辞和行号会因编译器版本及源文件布局而异。

可以运行 g++ -Wall -o hello hello.cpp,让 GCC 启用常见警告。-Wall 是一个实用的起点,但它不会启用 GCC 提供的所有警告。警告是诊断信息,可能提示代码中存在可疑之处;请检查警告,并判断是否需要修改代码或构建选项。

链接多个文件

程序可以在一个源文件中定义函数,再从另一个源文件调用它。例如,main.cpp 可以包含 <iostream>,声明 int add(int, int);,并定义 int main() { std::cout << add(2, 3) << '\n'; }。在 functions.cpp 中定义 int add(int a, int b) { return a + b; }。声明和定义相匹配后,编译器就能检查函数调用,链接器也能将调用连接到函数实现。

使用一条命令构建这两个源文件:g++ -o my_program main.cpp functions.cpp。此命令会分别编译源文件,并将它们链接成名为 my_program 的可执行文件。在 Linux 或 macOS 上运行 ./my_program;该示例会输出 5。在 Windows 上,请按照所用 shell 支持的方式运行生成的 my_program.exe。

结论

对于普通的 GCC C++ 构建,可以使用 g++ -o program source.cpp,然后运行该命令生成的可执行文件。gcc 驱动程序也能编译 C++,但在 GNU/Linux 环境中,可能需要显式添加 -lstdc++。通常选择 g++ 就不必额外指定这个库选项。

常见问题

  1. GCC 是什么? GCC 是 GNU Compiler Collection(GNU 编译器套件),提供用于 C++、C 和其他语言的编译器驱动程序。
  2. 如何检查是否已安装 GCC? 运行 g++ --version 检查 C++ 驱动程序,或运行 gcc --version 检查 C 驱动程序。
  3. 编写 C++ 程序时,为什么使用 g++ 而不是 gcc? g++ 会自动选择 C++ 链接行为,包括链接典型程序所需的标准库。使用 gcc 时,GNU/Linux 构建可能需要显式指定 -lstdc++。
  4. 能否用一条命令编译多个 C++ 文件? 可以。在 g++ 命令中列出每个源文件,例如 g++ -o my_program main.cpp functions.cpp。
  5. -o 有什么作用? 它用于指定输出文件的名称。对于 g++ -o hello hello.cpp 这样的完整构建命令,输出文件是可执行文件。