[原创]DLL, lib静态、动态库
说一说静态库、静态链接;动态库、动态链接,大牛不要拍砖哟!
1、静态库,分成两类吧,
第一种、指包含输出函数声明、实现代码的*.lib;
第二种、包含函数声明、函数引用地址的*.lib;
第一种静态库多出现在DOS操作系统时代,在使用这种静态库时会增加目标PE文件尺寸。
在win32以后的NT类型操作系统上,使用第二种居多,这一种不会增加目标文件尺寸,不过运行的效率相对低些。
针对第一种静态库,我的理解,使用这种库最终编译链接生成的PE会包含库中实现代码;
针对第二种静态库,是与DLL一同生成,在被引用时使用,DLL的实现代码不会被链接至目标PE;
2、动态库DLL
首先,我的理解,无论是动态链接还是静态链接,目标PE内都不会包含DLL导出函数的实现代码,只会包含函数在DLL中的相对地址。动态链接和静态链接的区别在于,动态链接是在PE运行后使用对应的API来初始化、加载、析构,一个是在编译时确定库函数地址。从效率上讲后者编译出来的PE在启动初期会比前者低。
针对DLL的静态链接(或DLL隐式调用),我的解释:在编译时链接生成目标PE时需要提供导入库函数声明、地址,这种方式生成的PE文件依赖库中可以查看到对应的DLL;
针对DLL的动态链接(或DLL显式调用),我的解释:生成的目标PE文件依赖库中不包含对应的DLL信息,而只是在PE运行时使用相应的LoadLibrary, GetProcAddress, FreeLibrary来动态调用DLL中函数;
总结,静态库(文中第二种静态库)不一定会增加目标PE尺寸,而DLL一定不会增加目标PE尺寸。
增加目标PE尺寸定义:包含引用库函数实现代码。
注,红色部分,是我后期增加的。
