编译过程概述和GCC命令
-
预处理期
主要进行预处理指令的替换 #include头文件和#define宏
条件编译 #if #ifdef #ifndef
经过预处理只剩下源代码
GCC命令: gcc -E hello.c -o hello.i -
编译期
主要进行语法分析 生成汇编指令
删除注释 删除多余的空格 变成严格的代码格式
int a; ==> int a;
词法分析 将语句拆分成不可分割的单词
int a; ==> int和a 将int和a分别存储在不同位置
语法分析 验证语法规则 不同的编译器实现不同
语义分析 语法正确但是语句表达的意思可能有问题
if(a=3) 在C语言中衡为true 那么else语句块一定不会执行 这种情况会报一个warning
GCC命令: gcc -S hello.i -o hello.s -
汇编期
将代码从汇编代码转换成二进制文件
经过编译期没有错误的情况下 将代码优化
int a = 12;定义了a这个变量但是后续没有使用这个变量 那么就会将这条语句删除
但也会产生指令重排序 多线程a++这种问题
GCC命令: gcc -c hello.s -o hello.o -
链接期
将系统提供的函数库和自己的代码链接到一起 生成可执行文件 多个obj文件 -> 可执行文件
静态链接库就是这个时期链接到代码中 GCC命令: gcc -v hello.o -o hello
以上四个步骤按顺序执行后源代码变成可执行文件