(转).lib文件,动态链接库的导入库和静态链接库
目前,以.lib为后缀的库有两种,一种为静态链接库(static library,简称“静态库”),另一种为动态链接库(DLL,简称“动态库”)的导入库(import library)。
静态库是一个或者多个.obj目标文件的打包,所以有人干脆把从目标文件生成库文件的过程称为Archive,即合并到一起。比如你链接一个静态库,如果其中有错,它会准确地找到是哪个目标文件有错,静态库只是一个"壳子"。
动态库一般会有对应的导入库,方便程序静态载入动态链接库,否则你可能就需要自己LoadLibrary调入DLL文件,然后再售公告GetProcAddress获得对应的函数了。有了导入库,你只需要链接导入库后按照头文件函数接口的声明调用函数就可以了。
静态库和导入库的区别很大,他们本质是不一样的东西。静态库本身就包含了实际执行代码、符号表等;而对于导入库而言,其实际的执行代码位于动态库中,导入库只包含了地址符号表等,确保程序找到对应函数的一些基本地址信息。
使用动态库,是很多开源代码发布的惯用方式:
1. 预编译的开发包:包含一些.dll文件、.lib文件以及其头文件。这里的.lib就是导入库,不要错误认为是静态库。但是引入方式和静态库一样,要在VC++目录中添加.lib的路径。而.dll则最好放到工程文件夹中,这样运行时,就会自动调入动态链接库。
2. 用户自己编译:下载的是源代码,按照readme自己编译。生成的很可能是.dll+.lib。
3. 如果你只有.dll,并且你知道动态链接库中导出的函数原型,那么你可以直接在自己程序中使用LoadLibrary调入DLL文件,GetProcAddress