Visual Studio 使用C++制作DLL 库

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);

 

posted @ 2025-05-19 00:38  王廷胡_白嫖帝  阅读(567)  评论(0)    收藏  举报