动态库
-
动态链接库简称DLL,同时以.dll 为后缀,主要用于提供代码和数据
-
dll 并不是所有数据都能被访问到,必须要进行导出
-
-
动态链接库在内存中始终只保存了一份数据,起到了节约内存的作用
-
生成动态链接库的时候会附带一个 lib,这个lib叫做导入库
-
导入库同于提供导出函数和数据在 dll 中所处的位置,不提供代码
-
如果使用隐式链接的方式使用动态链接库,必须要 dll 文件
-
-
动态链接库的创建
-
//老师演示的时候是生成两个文件。一个header.h。一个.cpp。
//自己复习的时候,创建完生成了4个文件:header.h targetver.h dllmain.cpp 动态库2.cpp -
方法一:声明导出
1.创建动态库文件
2.写文件信息
3.运行。
-
DLL 程序的入口函数(了解),可写可不写的函数
-
(写在dllmain.cpp,函数定义也写在这)
// DLL 程序的入口函数,会在不同的情况下被调用
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
} -
函数的导出方式:使用声明进行导出
-
(写在header.h)
-
DLL 导出的函数不应该有名称粉碎,所以需要使用 extern "C" 取消名称粉碎
-
-
方法二函数的导出方式:使用模块定义问文件进行导出
1.创建动态库文件
2.写文件
3.设置模板定义
4.运行
-
(写在header.h)
// 声明函数
void show1();
void show2();
void show3();
//直接声明函数,相比方法一,不需要DLLAPI宏定义声明来粉碎名称。 -
新建一个文件,后缀名改def。名称随意。内容如下。
-
模块定义文件自己会取消名称粉碎,推荐使用
EXPORTS
show1 @ 1
show2 @ 2
show3 @ 3 -
-
-
动态链接库的使用方式
-
显示的使用动态链接库
// 2. 显示连接,依赖于一组API
HMODULE hModule = LoadLibrary(L"../Debug/04. 动态库和静态库.dll");
// 2.1 如果返回值非 0, 就获取函数
if (hModule) fun = (pfun)GetProcAddress(hModule, "show1");
// 2.2 如果函数非空,就调用函数
if (fun) fun();-
隐式链接使用动态连接库
// 1. 使用隐式链接的方式调用导出函数
-
// 包含头文件是为了获取函数的声明
#### 静态库
- 静态库的创建
- 静态库会生成一个 lib 文件,提供了所有的代码,又叫做**对象库**
- (此处截图用的跟上面动态同一个文件,只是更改了生成方式)
#### 静态链接库和动态链接库的区别
- 使用 dll 的程序必须自带 dll,使用 lib 的程序可以不带 lib
- 使用 dll 的程序通常比较小,使用 lib 的程序通常比较大
- 使用 lib 的程序可以进行跨平台
- 静态链接库的 lib 和 的动态链接库的 lib 不同,分别是对象库和导入库