Windows环境下的静态库和动态库介绍
一、简介
在Windows系统下常见的库有两种一种是以.lib为扩展名的库,也叫lib库。lib库实际上分为两种:一种是静态链接lib库或者叫做静态lib库,另一种是动态链接库dll库的lib导入库或称为lib导入库。以dll为扩展名的库叫dll库,dll库只有一种就是用于动态链接的动态链接库(也叫dll库,dll是:dynamic link library的英文单词首字母缩写)。在发展史上,动态链接库的出现晚于静态链接库的出现。
二、lib库的详细说明
静态lib库
静态lib库,包含了所有的代码实现的,是源代码文件.c或.cpp文件编译生成的,这个lib库就是文本形式的源代码编译后的二进制形式代码。
lib导入库
lib导入库,这个库里只是相应的dll文件中的所有函数在dll文件中的地址的说明。也就是这个lib导入库里没有函数的具体实现,只是对相应的dll文件的说明。
也就是说目前以.lib为后缀的库有两种,一种为静态链接库(static library,简称“静态库”),另一种为动态链接库(DLL,简称“动态库”)的导入库(import library)。
两种库的说明
从两种库的说明可以看出,静态lib库文件里是包含了所有的代码的,所以只要导入后,使用链接器链接生成exe文件后,那么exe文件就可以直接使用exe 内部的代码了。这个静态链接lib库的过程就相当于把静态lib库里的所有二进制的代码复制到exe文件中。所以,链接完后,静态lib库文件就不需要了。最后, 我们只要exe就行了。这个lib在链接完后,就已经失去价值了。只有下次再编译生成exe文件时,才再此需要。发版时,只提供给别人exe就行,不需要提供静态lib库。缺点是导致exe文件太大。每次修改静态lib库文件里的代码,都需要重新编译生成新的exe文件。优点是:依赖性小。小的应用程序,适用使用静态lib库,大的应用程序不适合使用静态lib库。
lib导入库可以说明相应的dll库的内部结构,简直就对dll内部了如指掌,我们通过lib导入库,再把相应的dll文件放到合适的位置(这个再后面再说具体放到哪里),程序运行时,就可以轻松调用到dll里面的函数。
两种lib库的相同点和不同点
相同点:两种lib都是用于编译的链接阶段,都把自身的内容复制拷贝到exe文件内,在正确生成exe后,两种lib库的使命也就完成了。也就是说后续运行exe程 序,就用不到了(即程序的运行阶段)。这里要说明一下,虽然lib导入库中不存在函数的具体实现,但是其里面有函数具体在哪个dll文件中的说明。那么在源代码生成的目标文件,在链接阶段,通过在lib导入库文件中,查到相应的外部函数的实现在对应的dll文件中的地址说明,也就保证链接阶段的正确通过,而其相应的具体的dll文件并不参与整个编译的阶段,而是在程序运行阶段才实际需要到,真正的实现了说明和实现的分离。
不同点:静态库是一个或者多个.obj目标文件的打包,静态库只是一个“壳子”,静态库报错的话,会定位到某个.obj目标文件。静态库和导入库的区别很大,他们本质是不一样的东西。静态库本身就包含了实际执行代码、符号表等;而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。