编译与链接
- 翻译环境和运行环境
在ANSIC的任何一种实现中,存在两个不同的环境:
第一种是翻译环境,在这个环境中源代码被转换为可执行的机器指令(二进制指令)
第二种是执行环境,它用于实际执行代码
- VS2022这样的软件叫做集成开发环境,包含了编辑器,编译器,连接器,调试器等工具。
- 翻译环境
- 翻译环境是由编译和链接两个大的过程组成的,而编译又可以分解成:预处理、编译、汇编三个过程
一个C语言的项目中可能由多个 .c 文件一起构建,多个 .c 文件单独经过编译器,编译处理生成对应的目标文件
注:在Windows环境下的目标文件的后缀是 .obj,Linux环境下目标文件的后缀是 .o
多个目标文件和链接库一起经过链接器处理生成最终的可执行程序
注:链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库
- 如果再把编译器展开成3个过程,那就变成了以下的过程:
- 预处理:
在预处理阶段,源文件和头文件会被处理成为 .i为后缀的文件,预处理阶段主要处理那些源文件中以#开始的预编译指令。例如:#include,#define等
- 编译:
编译过程就是将预处理后的文件进行词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件
- 汇编:
汇编器是将汇编代码转转变成机器可执行的指令,每一条汇编语句几乎都对应一条机器指令。根据汇编指令和机器指令的对照表进行翻译,不做指令优化
- 链接:
链接是一个复杂的过程,链接的时候需要把一堆文件链接在一起才生成可执行程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等。链接解决的是一个项目中多文件、多模块之间互相调用的问题