我们知道lib文件存在两种情况:
(1)动态链接 库dynamic link library
LIB包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接 库dynamic link library。
虽然lib导入库不是很重要,但是为了方便使用dll,lib导入库还是很常用。但是没有lib导入库,也是可以使用dll的。所以说,lib导入库是一个附加的增值产品。
dll是用来动态链接的,也就是程序运行时才链接的。静态链接就是在生成exe时就链接到exe里了。链接最终的目的是要将dll载入到和exe同一个进程空间中。尽管这里是动态链接,它只是在链接的时间上延迟罢了。静态链接时,直接在生成时将库的内容放在了exe中,当exe文件加载到内存时,链接的库的内容也加载到内存了。动态链接库dll则是在生成exe的时候只用了一个占位表,叫做重定位表。然后在exe需要的时候,再将dll加载到exe所在的进程的内存空间中。
所以说,不管是静态链接还是动态链接,最终都是要到exe的进程内存空间中的,是跑不了的。躲得了初一躲不了十五,dll只是延迟加载到内存罢了。
我们要使用dll,为了方便知道dll中的所有函数都在什么位置,就用上了lib导入库。这个导入库记录了dll中的所有函数在dll中的位置,那么我们引入了lib导入库之后,在运行的时候,在加载了dll后,就可以方便的定位需要的函数了。有了这个lib导入库,我们不需要手动的去找dll中的函数了。使用dll就和静态lib库或者和直接的源码中写的函数一样简单。
另一种就不用lib导入库了,使用API函数LoadLibrary来加载dll到内存中,然后使用API函数GetProcAddress来找到dll中的函数地址。这里的使用,将在dll的专题中讲解,就不多述了。
(2)静态链接库static link library
LIB包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
如果是第一种,那么必须再配套有dll才能正确运行。
所以,下载了一个lib,如何判断该lib文件是静态库还是动态库的导入文件呢?
这里使用VS自带的lib.exe来查看:
1、找到:安装目录/VC/bin/lib.exe:
双击运行一下,如果弹出提示:缺少mspdb100.dll,那么就到:安装目录/Common7/IDE/mspdb100.dll,将其拷贝到安装目录/VC/bin文件夹下;双击后,会一闪即逝。
2、使用dos环境打开lib.exe:
找到开始菜单中的”运行“,输入cmd,回车,将lib.exe文件直接拖到dos环境中,回车。
3、可以看到有好几个选项,查看lib文件的为:/LIST[:文件名]:
注意查看命令为:/list
4、查看lib文件:
重新一次前面的操作:将lib.exe拖入,空格,输入:/list,空格,拖入需要查看的lib文件,回车。
5、后缀显示为:.dll的,则lib文件为动态库的导入文件;.obj的,则lib文件为静态库。