预编译:
预编译又称为预处理,是做一些代码文本的替换工作
将头文件展开,取消注释,替换所有宏定义的符号
编译:
将文件进行词法分析,语法分析,语义分析,符号汇总后,将代码翻译为汇编语言(汇编语言就是MOV,ADD之类的东西)
汇编:
将文件转换为二进制文件即目标文件,每一个源文件对应一个目标文件,在windows中目标文件的后缀为.obj
链接:
其实就是一个“打包”的过程,它将所有二进制形式的目标文件和系统组件组合成一个可执行文件。完成链接的过程也需要一个特殊的软件,叫做链接器。
在完成汇编后,各个目标文件还没有“联系”起来,一个目标文件中使用的函数或变量,可能定义在其他的目标文件中,也可能定义在某个链接库文件中。对于各个目标文件中缺失的函数和变量的存储地址,会在链接阶段由链接器,并最终将所有的目标文件和链接库组织成一个可执行文件。在windows下这个可执行文件后缀为.exe。
链接库:
所谓链接库,就是将一些源文件进行编译,打包后得到的二进制文件。虽然链接库是二进制文件,但无法独立运行,必须等待其它程序调用,才会被载入内存。库文件往往带有一个头文件,方便需要链接这个库的程序查看如何调用。链接库分为静态库和动态库两种。
静态库:
Windows中后缀名为.lib。静态库在编译是会直接整合到目标程序中,所打包出来的文件可以独立运行在任何地方。利用静态函数库编译成的文件会比较大,如果这个静态库由更新,就需要重新编译。
动态库:
windows中后缀名为.dll。动态库在编译的时候不会被整合到目标程序中,生成的可执行文件无法单独运行。所以编译链接后的文件中仍然有变量和函数的缺失,这些缺失会在程序运行的时候被修补。具体来讲,对于一个以动态链接方式运行的项目,首先由静态链接器将所有的目标文件组织成一个可执行文件,运行时才会将所需的动态链接库全部载入内存,由动态链接器完成可执行文件和动态库文件的链接工作。
动态链接库可以随可执行文件一同载入内存,也可以在可执行文件运行过程中载入,即可执行文件什么时候需要,动态链接库才会载入内存。
对于不同的库,链接器在链接阶段所做的工作是不同的。
对于静态库,链接器会逐个找到各目标文件中缺失的地址。采用此链接方式生成的可执行文件,可以独立载入内存运行。
对于动态库,链接器先从所有目标文件中找到部分缺失的地址,然后将所有目标文件组织成一个可执行文件。如此生成的可执行文件,仍缺失部分函数和变量的地址,待文件执行时,需连同所有的链接库文件一起载入内存,再由链接器完成剩余的地址修复工作,才能正常执行。
参考链接:
https://blog.csdn.net/yao00037/article/details/120166233
http://c.biancheng.net/dll/what_is_library.html