引言
在 Linux 开发环境中,gcc 和 g++是最常用的编译器工具,它们承担着将源代码转化为可执行程序的核心任务。其中,gcc 专注于 C 语言程序的编译,而 g++则同时支持 C 和 C++ 语言。理解这两款编译器的工作原理和使用方法,是掌握 Linux 开发的基础技能。
一、编译的四个核心阶段
从源代码到可执行文件,gcc/g++的工作流程分为四个关键阶段,每个阶段都有明确的输入、输出和任务目标。
| 阶段 | 命令示例 | 输入 | 输出 | 主要任务 |
|---|---|---|---|---|
| 预处理 | gcc -E | .c/.cpp | .i | 宏替换、头文件展开、删除注释 |
| 编译 | gcc -S | .i | .s | 语法分析、生成汇编指令 |
| 汇编 | gcc -c | .s | .o | 转换汇编为机器码 |
| 链接 | gcc *.o | .o | 可执行文件 | 合并目标文件、解析库引用 |
1. 预处理阶段:代码的初步加工
预处理是编译的第一个环节,主要负责对源代码进行'前期处理',包括:
- 宏定义的替换(如
#define指令) - 注释的删除(避免注释干扰编译过程)
- 条件编译的处理(如
#if、#ifdef等指令) - 头文件的展开(将
#include指令引入的头文件内容插入到当前文件中)
预处理阶段的输入是 .c(或 .cpp)源文件,输出是 .i 文件。在 Linux 中,可通过以下命令单独执行预处理:
gcc -E code.c -o code.i # 对 C 文件进行预处理,生成 code.i
g++ -E code.cpp -o code.i # 对 C++ 文件进行预处理
其中,-E 参数表示'仅执行预处理阶段',-o 用于指定输出文件的名称。预处理后的 .i 文件仍是文本格式,可通过 cat 命令查看内容。
Linux 系统的标准头文件(如 stdio.h、stdlib.h)默认存储在 /usr/include/ 目录下,预处理时编译器会自动到该路径搜索头文件。
2. 编译阶段:从高级语言到汇编语言
编译阶段的任务是将预处理后的 .i 文件转化为汇编语言代码。编译器会对代码进行语法检查、语义分析,并最终生成与硬件架构相关的汇编指令。
该阶段的输入是 .i 文件,输出是 汇编文件。执行命令如下:


