1、编译流程
编译分为四大过程:
- 预处理
- 编译
- 汇编
- 连接
预处理:
- 完成宏替换、文件引入,以及去除空行、注释等,为下一步的编译流程做准备。
-
也就是对各种预处理命令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。
编译:
- 将预处理后的代码处理成汇编语言。在这个阶段首先要检测代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,在把代码翻译成汇编语言。
- 编译程序执行时,先分析,后综合。分析就是指词法分析、语法分析、语义分析和中间代码生成。综合,就是指代码优化和代码生成。
-
大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,也有的是先产生汇编语言一级的符号代码文件,在调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。
汇编:
-
汇编就是把编译阶段生成的“.s”文件转成二进制目标代码,也就是机器代码(01序列)。
链接:
- 链接就是将多个目标文件以及所需的库文件链接生成可执行目标文件的过程。


2、静态库
什么是静态库?
- 静态库实际就是一些目标文件(一般以.o结尾)的集合,静态库一般以.a结尾,只用于生成可执行文件阶段
- 在链接步骤中,链接器将从库文件取得所需代码,复制到生成的可执行文件中。这种库称为静态库。其特点是可执行文件中包含了库代码的一份完整拷贝,在编译过程中被载入程序中。缺点就是多次使用就会有多份冗余拷贝,并且对程序的更新、部署和发布会带来麻烦,如果静态库有更新,那么所有使用它的程序都需要重新编译、发布。
如何生成静态库?

r:表示增加或更新新文件到静态库中
c:表示创建一个库,不管存在与否都创建
s:创建文档索引,创建较大的库的时候,能够加快编译时间
3、动态库
什么是动态库?
*动态库在连接阶段没有被复制到程序中,而是在程序运行时由系统动态加载到内存中供程序调用。
*系统只需载入一次动态库,不同的程序可以得到内存中相同动态库的副本,因此节省了很多内存。
如何生成动态库?

静态库与动态库区别?
载入时刻不同:
- 静态库在程序编译时会链接到目标代码中,程序运行时不再需要静态库,因此体积较大。而且每次编译都需要载入静态代码,因此内存开销大。
- 动态库在程序编译时不会被链接到目标代码中,而是在程序运行时才被动态的加载,程序运行时需要动态库存在,因此体积较小。而且系统只需一次动态库,不同程序可以得到内存中相同的动态库副本,因此内存开销小。
网友评论