动态库文件(Dynamic Link Library,DLL)是程序在运行时所需要调用的库。静态库文件是程序在编译时所需要调用的库。
1 环境介绍VS版本:VS2017
编程语言:C++
2 功能介绍使用VS2017项目模板创建C++动态库生成工程,编写功能函数,并生成动态库;然后再创建一个C++工程调用动态库中的功能函数进行测试。
3 创建动态库 3.1 新建“具有导出项的(DLL)动态链接库”模板在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 ->具有导出项的(DLL)动态链接库”,并设置项目名称和位置。本示例的名称设为Dll_Library,存放在G:\C++\Practices中。
创建完成后,该项目下会自动生成一个示例模板:Dll_Library.h和Dll_Library.cpp。在.h文件中进行函数申明或类定义,在.cpp文件中进行实现。
3.2.1 Dll_Library.h #ifdef DLLLIBRARY_EXPORTS #define DLLLIBRARY_API __declspec(dllexport) #else #define DLLLIBRARY_API __declspec(dllimport) #endif // 模板中自动提供的示例 // 此类是从 dll 导出的 class DLLLIBRARY_API CDllLibrary { public: CDllLibrary(void); // TODO: 在此处添加方法。 static void Print(); }; extern DLLLIBRARY_API int nDllLibrary; extern DLLLIBRARY_API int fnDllLibrary(void); // 自己编写的功能函数 extern DLLLIBRARY_API void Print(void); extern DLLLIBRARY_API int sum(int a, int b); 3.2.2 Dll_Library.cpp // Dll_Library.cpp : 定义 DLL 的导出函数。 #include"pch.h"#include"framework.h"#include"Dll_Library.h"#include右键点击项目,选择“生成”来编译生成动态库。
在“新建项目”窗口中,选择“Visual C++ -> Windows桌面 ->控制台应用”,并设置项目名称和位置。本示例的名称设为UseDLL,存放在G:\C++\Practices中。
3.4.1 UseDLL.cpp #include"Dll_Library.h"#include由于Dll_Library.h不在UseDLL项目目录中,会提示#include"Dll_Library.h"引用失败。
3.4.2.1 复制Dll_Library.h到UseDLL项目目录中该方法虽然能够解决该问题,但是在后续修改Dll_Library项目后仍需要重新复制。
3.4.2.2 在UseDLL中配置附加包含目录右键点击UseDLL项目,选择“属性”,在属性页窗口中:
将“配置”选择为“所有配置”,“平台”选择为“所有平台”;在“配置属性 -> C/C++ -> 常规 ->附加包含目录”中添加Dll\_Library.h所在目录的路径。3.4.3 链接.lib文件
在使用 #pragma comment(lib,"DLLLIBRARY.lib")时,默认和UseDLL的.cpp文件在同一文件夹下。将DLLLIBRARY.lib文件复制到UseDLL.cpp的同一文件夹下也能够解决问题,但后续修改时仍然需要复制。
3.4.3.1 在UseDLL中配置附加库目录右键点击UseDLL项目,选择“属性”,在属性页窗口中:
在“配置属性 -> 链接器 -> 输入 -> 附加依赖项”中添加 DLLLIBRARY.lib。3.4.4 链接.dll文件
当调试运行程序时,会出现“找不到.dll文件”的错误,需要将dll文件拷贝到项目运行目录下,此示例下需要拷贝到G:\C++\Practices\UseDLL\Debug下,通常在程序发布时要这么做,但是在调试时不建议这么做,因为后续修改时需要重新拷贝复制。
3.4.4.1 在UseDLL中配置调试环境右键点击UseDLL项目,选择“属性”,在属性页窗口中:
在“配置属性 -> 调试 ->环境”中添加DLLLIBRARY.dll所在的目录路径。3.5 运行结果