编译和链接
文件变为可执行文件的路程
test.c->test.obj->test.exe
ps:目标文件也是二进制文件,不能打开文本编辑器读懂
编译和链接也可以分为四个阶段
预编译,编译,汇编,链接
由 预处理器、编译器、汇编器、和链接器 执行
四个过程分别作用于文件并生成
.c>.i->.s->.o->exe
汇编器将文本文件变为二进制文件
编译
多个.c文件单独经过编译器
注意:链接的时候,多个目标文件一起经过链接器链接
编译=预编译+编译+汇编
预编译(预处理)
- 替换#define定义的宏
- 处理预编译的指令 #if #endif
- 替换#include引用的头文件
- 保留#pragma编译器指令·
- 删除注释
- 添加行号和文件名标识,方便后续的调试
预处理阶段可以认为是简单的文本替换
编译
语法分析,词法分析,语义分析
符号汇总(函数符号Add)
词法分析(扫描器)
拆分括号,文本,标识符,运算符
语法分析(语法分析器)
语法树
语法分析器将记号(Token)产生语法树(Syntax Tree)。yacc工具可实现语法分析
语义分析
静态语义分析
汇编
把文本语言翻译成二进制机器语言
形成符号表(函数符号Add,函数地址)
对于extern声明,单独编译的时候不知道具体的地址。但是在符号表后期链接的时候会合并,生成最终可执行程序的时候符号会重定位。
ps:若只是声明而没有实际定义,编译阶段可以过,则在链接的时候会显示:link:无法解析的外部链接。
链接
把多个目标文件链接生成一个可执行程序
空间和地址分配
符号的决议和重定位
意义:实现分离编译
运行
载入内存,开辟栈,可以使用静态区,运行到main结束或者意外终止。