Visual Studio 使用C++制作DLL 库
一、为什么需要 DLL?
.dll文件是Dynamic Link Library(动态链接库)文件的缩写,它是一种共享库文件,包含了程序所需的代码和数据。 与静态链接库不同,动态链接库可以在程序运行时动态加载,使得程序的内存占用更小,同时也方便了程序的更新和维护。
编程中的 DLL:
DLL (Dynamic Link Library) 是一个包含代码和数据的文件,可以被多个程序同时使用。
优点:
代码复用:多个程序可以共享同一个 DLL,减少磁盘和内存占用。
模块化开发:不同团队可以独立开发 DLL,然后集成到主程序中。
便于更新:只需更新 DLL 文件,无需重新编译整个程序。
常见应用场景:
Windows 系统中的 user32.dll(处理窗口和消息)、kernel32.dll(系统核心功能)。
游戏中的插件系统(如《魔兽世界》的插件)。
软件开发中的第三方库(如 SQLite、OpenCV)。
二、DLL 与普通程序的区别
特性
普通可执行文件 (.exe)
DLL 文件 (.dll)
是否可以独立运行?
✅ 可以直接双击运行
❌ 必须由其他程序加载和调用
入口函数
main() 或 WinMain()
无显式入口,由系统自动初始化
用途
独立应用程序
为其他程序提供功能
加载方式
程序启动时一次性加载
动态加载(按需加载)
动态链接 vs 静态链接:
静态链接:编译器将库的代码直接复制到可执行文件中,生成的 .exe 文件体积大,但无需依赖外部文件。
动态链接:程序运行时才加载 DLL,多个程序可以共享同一个 DLL,节省内存。
三、DLL 的核心概念
1.导出与导入
导出 (Export):DLL 中哪些函数或变量可以被外部访问。
类比:图书馆的哪些书籍可以外借(如教科书可以借,工具书只能在馆内查阅)。
导入 (Import):程序如何使用 DLL 中的导出内容。
2.__declspec(dllexport) 关键字
作用:告诉编译器 “这个函数 / 类 / 变量要导出到 DLL 中,让外部程序可以使用”。示例:
// 导出一个加法函数
__declspec(dllexport) int Add(int a, int b) {
return a + b;
}
3.导出表 (Export Table)
DLL 文件内部有一张 “清单”,记录了所有导出的函数和变量。可以用工具(如 Visual Studio 的 dumpbin 命令)查看导出表:
dumpbin /exports MyDLL.dll
4.C++ 名称修饰 (Name Mangling)
C++ 为支持函数重载,会将函数名修改为包含参数类型和返回值的复杂名称(如 Add(int, int) 可能变成 ?Add@@YAHHH@Z)。问题:其他语言(如 C#)无法识别这种名称。解决方案:使用 extern "C" 保持 C 语言的命名方式:
extern "C" __declspec(dllexport) int Add(int a, int b);