1. 链接库
- 是一种软件模块,通常是一个向应用程序提供某一特定功能的数据、函数和类的集合。
- 对用户来说是可以调用它,以提供相应服务功能的黑匣子,可以方便得使用别人开发的功能。
- 调用者不用管源代码及编译,库的开发者可以隐藏源代码(要混淆?)。
2. 静态链接库
- 生成的是.lib和.h文件,交付给使用者即可
- 何时链接:库与应用程序的链接是在编译链接时完成的,链接器会把要使用的库函数代码复制到应用程序的可执行文件中,因此在连接后,库文件是程序最终文件不可分割的一部分
- 优点
- 性能:代码装载速度快,执行速度略比动态链接库快
- 只需保证在开发者的计算机中有正确的.LIB文件,在以二进制形式发布程序时不需考虑在用户的计算机上.LIB文件是否存在及版本问题,可避免DLL地狱等问题。
3. 动态链接库
- 生成的是.dll文件,还会有一个与它对应的导入库文件(扩展名为lib,包含函数列表)
- 何时链接:不会被编译到exe可执行文件/程序中,平时就在硬盘上,只有当使用它的应用程序在运行过程中真的需要调用时才被装载到内存中
- 必须有一个入口函数DllMain,做一些初始化的工作
- 优点
- 必要时才装载,节省内存空间
- 如果一个动态链接库被多个应用程序使用,那么只放一个就行了,节省空间,而静态链接库会被重复链接到各个应用程序中
- 如果库有变动,只需要编译连接生成dll并替换即可,不需要动应用程序(甚至可以运行时替换?没有正在被用的话)
- 运行过程中,真正调用时才使用它,因此运行中调不到的话,也不会报错
- 导出函数
- 被声明为可导出的函数(export function)
- 否则就只是内部函数(internal function)
- 如果站在调用者的角度,就叫导出函数了
- 编写dll时,要对库中的可导出函数进行必要的声明。一种方式是在模块定义文件(扩展名为DEF)中声明;另一种方式是在导出项前面使用关键字declspec(dllexport)声明。
- 用MFC编写DLL
- 既可以用于MFC应用程序,也可以用于非MFC应用程序
- 常规型:又分为与MFC静态链接的DLL和与MFC动态链接的DLL
- 扩展性:为了使DLL也可以导出MFC的继承类,在要导出的类名前面加宏AFX_EXT_CLASS。只能与MFC采用动态联编方式链接并且只能被MFC应用程序调用。
- 使用
- 隐式链接
- 在编译时把所需要的导入文件编译到项目中,程序中没有出现加载到入库文件的代码
- Windows系统根据入库文件在系统中按顺序搜索对应的DLL
- 包含应用程序EXE文件的目录
- 进程的当前工作目录
- Windows系统目录
- Windows目录
- 列在Path环境变量中的一系列目录
- 显式链接
- 使用Windows API函数来完成DLL的链接及函数的调用,这时就不用再使用导入库文件了。
- 好处是使用者可以指定dll模块
- 过程
- 使用Win32的LoadLibrary()函数获得DLL
- 使用DLL的句柄之后,再调用Win32 API函数GetProcAddress()来获得要使用的导出函数,返回的是DLL导出函数的地址
- 使用完DLL后,用FreeLibrary()函数来释放动态链接库
- 隐式链接