生成 DLL 时会生成一个与之匹配的 .lib 文件(导入库文件),用于存放调用 DLL 所需的信息。若是你想调用这个 DLL 则必须将 lib 连接进程序。(导入库 lib 文件和静态库的 lib 虽然都会被连接进程序,但二者的内容彻底不一样)函数
在 VS 上建立 DLL 须要使用 Microsoft 专用 C\C++ 扩展 —— dllexport 和 dllimport 存储类特性。可使用它们从 DLL 中导出或向其中导入函数、数据和对象。语法以下:性能
__declspec( dllimport ) declarator __declspec( dllexport ) declarator
提示: 若是不使用 __declspec(dllexport) 关键字导出 DLL 的函数,则 DLL 须要 .def 文件。模块定义 (.def) 文件是包含一个或多个描述 DLL 各类特性的 Module 语句的文本文件。操作系统
建立一个动态连接库项目。(Visual Studio:新建 C++ 项目-->Win32控制台应用,在 应用程序设置 页面的 应用程序类型 下选择 DLL)线程
// dll.h #pragma once #ifdef FUNCTION_EXPORTS #define FUNCTIONDLL_API __declspec(dllexport) // 导出,导出用于生成 DLL #else #define FUNCTIONDLL_API __declspec(dllimport) // 导入,用于导入 dllexport 导出的内容 #endif FUNCTIONDLL_API int a(int num1, int num2); FUNCTIONDLL_API int b(int num1, int num2);
// dll.c #define FUNCTION_EXPORTS #include "dll.h" int a(int num1, int num2) { return num1 + num2; } int b(int num1, int num2) { return num1 + num2; }
生成 DLL ,会获得 DLL 和 lib 文件。指针
调用/连接 DLL 有两种方法,一,隐式连接;二,显示连接。code
为隐式连接到 DLL,应用程序必须:对象
隐式连接后,程序操做 DLL 中函数的方法同本地函数并没有区别。进程
为显式连接到 DLL,应用程序必须:作用域
我建立的调用程序使用隐式连接:编译器
#include "dll.h" int main(void) { printf("%d\n", a(1, 2)); printf("%d\n", b(3, 4)); return 0; }
首先添加引用(两个项目在同一解决方案下才可引用),项目 --> 添加引用,将 DLL 项目添加进去(添加引用的目的是为了添加 lib 文件,效果与在 (若是不在同一解决方案,应使用下述方法:) 配置属性 --> 连接器 --> 输入 --> 附加依赖项 添加 lib 相同)。
而后添加附加包含目录,配置属性 --> C\C++ --> 常规 --> 附加包含目录,将 dll.h 文件的地址添加进去便可。
若是你的 DLL 和 调用程序再也不同一目录,能够将 DLL 所在目录添加至系统环境变量或将 DLL 同调用程序放至同一目录。
编译,执行结果以下:
3 7
大部分应用程序使用隐式连接,由于这是最易于使用的连接方法。可是有时也须要显式连接。下面是一些使用显式连接的常见缘由:
下面是须要注意的显式连接的两个缺点: