一、.obj
每一个.cpp文件在编译时都会生成对应的.obj。.obj文件内部是相对地址。
二、.lib
分二类:静态链接库.lib 和 动态链接库dll的导入库.lib。
静态链接库.lib是.obj文件的集合,就是多个.obj文件的打包。.lib不会对.obj文件进行链接。生成静态链接.lib时,编译器不会进行链接操作。
动态链接库dll的导入库.lib是对应dll文件中导出函数的地址表,这些函数的具体实现依然放在.dll中。
因为静态库.lib生成时不会发生链接操作,只是打包.lib文件,所以即使A-lib使用了B-lib,在生成A-lib时,A-lib中也只含有A程序中的所有cpp文件生成的.obj,不会有B程序中的.obj。
这个时候使用A-lib的程序就需要将A-lib和B-lib同时加到自己的lib依赖中,这样才能保证程序链接成功。
三、.dll
.dll是可执行格式的文件,它是将多个.obj文件进行链接后生成的可执行文件。
.dll支持二种链接方式:隐式链接和显式链接。
使用隐式链接时,使用.dll的程序需要将与该dll对应的导入库.lib链接到项目中。这样,在程序执行时,就知道从哪个dll的哪个地方加载函数。
使用显式链接时,不需要导入.lib,但要自己通过编程接口LoadLibrary和GetProcAddress等来告诉使用.dll的程序需要加载哪个dll的哪个函数。
隐式链接只适用于自己的项目,因为dll的代码修改后,相应的导入lib也改变,这个时候需要重新链接使用该dll的程序,这样才能保证使用dll的程序根据导入库.lib中给定的函数地址找到其在dll中的代码。
显式链接适用于第三方库。即使自己的dll代码发生了修改,只要相应的接口没有改变,那么使用该dll库的程序都不需要修改。
四、.exe
.exe是可执行格式的文件。
小结:
1,使用静态lib的程序在链接时,要求其使用到的所有静态lib都能找到,包括该程序使用的静态lib引用的静态lib;
2,使用dll的程序在运行时,要求其使用到的所有dll都能找到,包括该程序使用的dll引用的dll。
本文暂时没有评论,来添加一个吧(●'◡'●)