1. 简介
C语言程序从源代码到可执行文件(二进制文件)都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。
以hello.c文件为例:
#include <stdio.h>
int main(){
printf("hello world!\n");
}
在linux下编译C程序:
$ gcc hello.c -o hello # 编译
$ ./hello # 执行
hello world! # 输出文本
2. 编译的步骤
gcc命令编译C语言的过程中依次执行了四步操作:
- 预处理(Preprocessing)
- 编译(Compilation)
- 汇编(Assemble)
- 链接(Linking)
2.1 预处理(生成.i文件)
预处理器对源代码其进行一些文本性质的操作, 主要任务包括:
- 删除注释
- 插入被 #include 指令包含的文件内容
- 替换由 #define 定义的符号
- 确定代码的部分内容是否应该根据一些条件编译指令进行编译
预处理会生成一个.i的文件。
命令:
gcc -E hello.c -o hello.i
2.2 编译(生成.s文件)
编译器gcc把预处理后的文件进行语法分析、语义分析以及优化后生成汇编代码文件。
命令:
gcc -S hello.i -o hello.s
2.3 汇编(生成.o文件)
汇编器把汇编代码文件转换成中间目标文件
命令:
gcc -c hello.s -o hello.o // 注意:此处-c为小写
2.4 链接(生成可执行文件)
链接器把目标文件与所需要的附加的目标文件(如静态链接库、动态链接库)链接起来成为可执行的文件
命令:
gcc hello.o -o hello