引言
在 Linux 开发环境中,gcc 和 g++ 是最常用的编译器工具,它们承担着将源代码转化为可执行程序的核心任务。其中,gcc 专注于 C 语言程序的编译,而 g++ 则同时支持 C 和 C++ 语言。理解这两款编译器的工作原理和使用方法,是掌握 Linux 开发的基础技能。
一、编译的四个核心阶段
从源代码到可执行文件,gcc/g++的工作流程分为四个关键阶段,每个阶段都有明确的输入、输出和任务目标。
| 阶段 | 命令示例 | 输入 | 输出 | 主要任务 |
|---|---|---|---|---|
| 预处理 (Preprocess) | gcc -E | .c / .cpp | .i | 宏替换、删除注释、头文件展开、条件编译处理 |
| 编译 (Compile) | gcc -S | .i | .s | 语法分析、语义检查、生成汇编指令 |
| 汇编 (Assemble) | gcc -c | .s | .o | 转换汇编为机器码、生成目标文件 |
| 链接 (Link) | 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、)默认存储在 目录下,预处理时编译器会自动到该路径搜索头文件。


