预处理:处理一些#号定义的命令或语句(如#define、#include、#ifdef等),生成.i文件
编译:进行词法分析、语法分析和语义分析等,生成.s的汇编文件
汇编:将对应的汇编指令翻译成机器指令,生成二进制.o目标文件
链接:链接分为两种:静态链接和动态链接
(1).静态链接
在链接期,将静态链接库中的内容直接装填到可执行程序中。
在程序执行时,这些代码都会被装入该进程的虚拟地址空间中。
优点:运行速度快并且不依赖外部环境,因为在可执行程序中已经具备了所有执行程序所需要的任何东西,在执行的时候运行速度快。
缺点:1)浪费空间:因为每个可执行程序中对所有需要的目标文件都要有一份副本,如果运行多个程序并且这些程序都对同一个目标文件有依赖,那么目标文 件在内存中就会存在多个副本;
2)更新困难:因为每当一个依赖文件的代码修改了,这个时候就需要全部重新编译链接形成新的可执行程序。
(2).动态链接
在链接期,只在可执行程序中记录与动态链接库中共享对象的映射信息。(.lib文件中只包含该动态库.dll导出的函数和变量的符号名)
在程序执行时,动态链接库的全部内容被映射到该进程的虚拟地址空间。其本质就是将链接的过程推迟到运行时处理
优点:1)节约内存:即使需要每个程序都依赖同一个库,但是该库不会像静态链接那样在内存中存在多分副本,而是这多个程序在执行时共享同一份副本;
2)更新方便:更新时只需要替换原来的目标文件,而无需将所有的程序再重新链接一遍。当程序下一次运行时,新版本的目标文件会被自动加载到内存并且链接起来,程序就完成了升级的目标。
缺点:性能略差:因为把链接推迟到了程序运行时,所以每次执行程序都需要进行链接,所以性能会有一定损失。
标签:文件,副本,程序,可执行程序,编译,内存,过程,链接 From: https://www.cnblogs.com/rocky-chen/p/17379936.html