GCC编译器介绍

📅 2026/7/27 14:33:10
GCC编译器介绍
GCCGNU Compiler Collection的编译流程将源代码转化为可执行文件主要分为预处理 (Preprocessing)、编译 (Compilation)、汇编 (Assembly) 和链接 (Linking) 四个阶段。为了方便理解可以把整个过程想象成一条流水线每个阶段都有其特定的任务。️ 第一阶段预处理 (Preprocessing)这是编译的第一步预处理器cpp 对源代码进行文本层面的处理。它不检查语法主要任务是“准备好”代码。主要任务处理所有以 # 开头的预编译指令。1头文件展开将 #include 指定的头文件内容插入到源文件中。2宏定义展开将代码中所有的 #define 宏进行替换。3条件编译处理 #ifdef、#ifndef、#endif 等指令决定编译哪些代码。4删除注释移除代码中的所有注释。5添加调试信息如行号等以便在编译出错时准确定位。输入/输出1输入源代码文件如 .c 或 .cpp。2输出预处理后的文件通常是 .i 或 .ii 文件。核心命令gcc -E source.c -o source.i1-E指示 GCC 仅执行预处理。2-o指定输出文件名。⚙️ 第二阶段编译 (Compilation)这是整个流程中最核心、最复杂的部分。编译器cc1 将预处理后的代码翻译成汇编语言。主要任务进行复杂的分析和转换。1词法分析将源代码字符流分解为有意义的“单词”或“记号”。2语法分析检查这些“单词”的组合是否符合编程语言的语法规则。3语义分析检查语句的上下文是否有意义如类型是否匹配。4代码优化在生成汇编代码前对中间表示进行优化。5生成汇编代码最终生成与目标 CPU 架构对应的汇编指令。输入/输出1输入预处理后的文件.i 或 .ii。2输出汇编代码文件.s 文件。核心命令gcc -S source.i -o source.s1-S指示 GCC 仅执行预处理和编译生成汇编代码后停止。️ 第三阶段汇编 (Assembly)1这个阶段相对直接汇编器as 将汇编代码转换为机器码。主要任务将汇编指令翻译成二进制机器指令并生成目标文件Object File。1目标文件包含机器指令和数据但其中的函数地址和变量地址还未最终确定。输入/输出1输入汇编代码文件.s 文件。2输出目标文件Linux 下为 .o 文件。核心命令gcc -c source.s -o source.o1-c指示 GCC 执行到汇编阶段生成目标文件后停止不进行链接。 第四阶段链接 (Linking)这是最后一步链接器ld 将所有的目标文件和库文件组合成一个完整的可执行文件。主要任务解决符号引用合并成最终文件。1符号解析链接器会查找并确定每个目标文件中引用的函数和全局变量的地址。例如main.o 中调用了 printf链接器就需要在 C 标准库中找到 printf 函数的实现。2地址重定位将各个目标文件中未确定的地址进行修正使其指向正确的内存位置。3合并节区将不同目标文件中相同类型的“节”如代码节、数据节合并。链接类型1静态链接在编译时将库代码直接复制到最终的可执行文件中。优点是独立缺点是文件体积大。2动态链接在程序运行时才加载所需的共享库如 .so 文件。优点是节省空间、易于更新缺点是程序运行时依赖外部库。输入/输出1输入一个或多个目标文件.o和相关的库文件。2输出最终的可执行文件Linux 下默认为 a.out。核心命令gcc source.o -o executable1直接使用 gcc 而不带 -E、-S、-c 等选项即可触发完整的四步流程。 常用 GCC 编译选项速查选项作用示例-E仅执行预处理不编译、汇编或链接。gcc -E main.c -o main.i-S仅执行预处理和编译生成汇编代码后停止。gcc -S main.i -o main.s-c执行预处理、编译和汇编生成目标文件后停止。gcc -c main.s -o main.o-o指定输出文件的名称。gcc main.o -o my_program-g生成调试信息供 GDB 等调试器使用。gcc -g main.c -o main-O0, -O1, -O2, -O3代码优化级别-O0 不优化-O2/-O3 是较高级别优化。gcc -O2 main.c -o main-Wall开启大部分常见警告信息帮助发现潜在问题。gcc -Wall main.c -o main-I指定头文件的搜索路径。gcc -I /my/includes main.c -o main-L指定库文件的搜索路径。gcc -L /my/libs main.c -o main-l链接指定的库。例如 -lm 链接数学库。gcc main.c -lm -o main 总结GCC 的编译流程是一个清晰、分阶段的转换过程1预处理 (.c → .i)文本替换与整合。2编译 (.i → .s)高级语言 → 汇编语言。3汇编 (.s → .o)汇编语言 → 机器码目标文件。4链接 (.o → 可执行文件)合并目标文件与库解析地址。理解这四个阶段能帮助你更深入地理解程序的构建过程并更有效地使用 GCC 的各种编译选项。