动态链接库
当我们使用动态链接库时,一般需要 dll
lib
头文件
。当程序编译时需要lib
文件和头文件
。一旦编译完成程序只需要dll
就可以运行(可以根据这个原理,减少程序发布包的体积)
如何制作动态链接库(关键点)
(可能并不好,但我就是这么做的)
- 新建一个空项目(别问我什么不从 动态链接库模板开始,我也忘记我是从哪里学的了)
- 修改此工程属性,确保它能生成动态链接库 一.
项目 → 项目属性 → 常规 → 配置类型
修改为动态库。二.项目属性 → 高级→ 目标文件扩展名
修改为 .dll。三.项目属性 → C/C++ → 预处理器→预处理器定义
删除 CONSOLE这个预定义
#ifndef MyToolLibrary
#define MyToolDll __declspec(dllimport)
#else
#define MyToolDll __declspec(dllexport)
#endif
导出符号和引入符号的宏定义,注意是两个下划线。导出整个类需要把 导出宏放在 class 和 类名之间。需要导出函数时需要放在被导出函数定义返回值的左边(因为这是微软规定的)使用 __declspec(dllexport) 从 DLL 导出
如何查看是否导出成功
Let’s make dependency walker fast again!
如何使用动态链接库
有隐式加载和显式加载两种方法。
- 隐式加载,只需要 dll 文件。
- 显式加载,编译时需要 lib 文件 头文件,运行时需要 dll 文件
解决导出符号改编的问题
这个主要用于 C 和 C++,dll 和应用程序相互调用的情况,C的编译器不存在函数改编的问题,而C++的编译器存在函数改编的问题。因为C++是支持函数重载的
//解决C++编译器导出符号存在函数名称改编的问题
extern "C" __declspec(dllexport)
extern "C" __declspec(dllimport)
使用动态链接库的好处
如果有多个进程需要加载相同的动态链接库,那么只需要加载一份就可以了。这样可以减轻体积