静态库
动态库
导入库
delay load
rebase
静态库:
以lib库(obj集合)的形式提供代码重用,需要和客户程序一起编译,成为一个二进制程序体。
动态库:
以二进制的dll提供代码重用,无需和客户程序一起编译。客户程序依赖其导出符号表(lib)。
dll和lib(静态库)在代码上的差别,主要是多了__declspec(dllexport)。
模板类不能导出。
静态链接:
1、#pragma comment(lib, "libname.lib").
2、使用additional dependencies添加libname.lib。(同时在Additional Library Directories中设置搜寻位置)。
以上两种方式的libname.lib可以是静态库,也可以是dll的导入库。同时,使用处需要库的头文件。
libname.lib为dll的静态库时,静态库就被引入了,可以编译了。相应被引用的函数和代码都被拷贝到exe中。
libname.lib为dll的导入库时,由于有了符号表和地址,也可以编译了。但函数代码和数据保存在dll中,只在exe被载入时,才把dll加载到内存。
3、是project dependencies设置依赖。相当于加lib。可以加静态库或动态库。
4、直接把lib文件添加到调用者的工程中。(没用过,不确定效果。)
动态链接:
1、LoadLibrary。
DllMain():
这个函数不是必须的。
不提供时,系统给提供一个默认的。(??)
查看dll的导出符合集:
dumpbin.exe /export dllname.dll
查看第三方dll所依赖的dll(特别是RT库的类型):
dumpbin.exe /import thirdparty.dll
dll文件位置:
dll应该放在和exe同目录中,或放在system PATH中。
留意使用的rt库类型:
表6-1 C/C++运行期库
库名 | 描述 |
LibC.lib | 用于单线程应用程序的静态链接库(当创建新应用程序时,它是默认库) |
LibCD.lib | 用于单线程应用程序的静态链接库的调试版 |
LibCMt.lib | 用于多线程应用程序的静态链接库的发行版 |
LibCMtD.lib | 用于多线程应用程序的静态链接库的调试版 |
MSVCRt.lib | 用于动态链接M S V C R t . d l l库的发行版的输入库 |
MSVCRtD.lib | 用于动态链接M S V C R t D . d l l的调试版的输入库。该库同时支持单线程应用程序和多线程应用程序 |