简单 Demo:C++编写、调用动态链接库

来源:互联网 发布:泰和安主机编程程序 编辑:程序博客网 时间:2024/05/20 01:13

一、引言

最近在使用 C++11 刷 LeetCode 的同时,渐渐萌生了自己写一个 LeetCode 内置数据结构库的想法。比如说,只需要输入:

[1, 2, null, 3]

就可以自动将其转化为二叉树的功能。

不过这里扯远了,要想自己写一个库,那么第一步就是如果编写一个能够方便让其他项目调用的库项目。

这里我选择了动态链接库。接下来,我将一步一步地建立一个 DLL 项目,并编写一个测试项目来调用它(暂时只实现了动态链接库的静态调用 T_T)。

首先声明,这篇博客的内容是我参照另外两篇博客的内容之后写出来的,内容大部分都是参考前人的思想结晶:

Visual Studio 写自己的动态链接库(DLL)
C++编写DLL动态链接库的步骤与实现方法

下面,让我们打开 Visual Studio 开始吧!

二、MyDll:我们自己的动态链接库项目

1. 建立一个空的解决方案:这个解决方案是用来装载我们的 MyDll 的动态链接库项目和 TestMyDll 测试项目的

1. 建立一个空的解决方案

2. 添加一个新项目 MyDll:这个项目就是我们的动态链接库项目

2. 添加一个新项目 MyDll

3. 设置项目属性:在弹出来的应用程序设置中,应用程序类型选择 DLL,附件选项选择 空项目,然后点击完成即可

3. 设置项目属性

4. 查看 dll/lib 等文件的输出目录:这里,我们右键项目属性,在常规中点击 输出目录,可以看到我们将要输出的 MyDll.dll 和 MyDll.lib 文件的输出目录,这个目录将在后面测试项目中使用

4. 查看输出目录

5. 编写代码:此时我们可以编写自己的代码了

// MyDll.h#ifdef MY_DLL_EXPORTS#   define MY_DLL_EXP __declspec(dllexport)#else#   define MY_DLL_EXP __declspec(dllimport)#endifclass MY_DLL_EXP HelloDll {public:    void hello();};

这里需要说明下,根据资料显示:

我们想要导出一个类来供客户端程序使用,那么需要在提供给客户端程序使用的类的头文件中 class 和类名之间加上 __declspec(dllimport),而在我们编译这个 DLL 项目的时候,则需要使用 __declspec(dllexport)。

那么我们怎么实现编译和调用的两个字段的不同的定义呢?

很简单,在 MyDll.h 中,我们通过预定义宏 MY_DLL_EXPORTS实现了这个功能,只要我们在预编译器中定义一下 MY_DLL_EXPORTS 宏,那么我们编译的时候就会导出函数;调用的客户端程序当然没有定义这个宏,则可以导入函数。

另外,我们将 __declspec(dllimport) 和 __declspec(dllexport) 都定义成了一个宏 MY_DLL_EXP。这样做的目的是方便我们定义我们的类或者函数的导入导出定义。

5. 定义自己的预定义宏

然后,我们就像普通的类实现一样,实现我们的自定义库类实现:

// MyDll.cpp#include <iostream>#include "MyDll.h"void HelloDll::hello(){    std::cout << "hello, this is my dll ^_^ " << std::endl;}

6. 编译、运行:现在可以编译我们的项目,记得如上图一样,在预处理器的地方定义自己的预定义编译宏 MY_DLL_EXPORTS,如果你配置正确了的话,应该可以看到如图内容:

6. 编译、运行

三、MyTestDll:测试我们的动态链接库(静态链接)

接下来,我们来静态链接我们的动态链接库。

1. 新添加一个测试项目:此时选择空项目即可,毕竟只需要运行一个 main 函数即可

1. 新建一个测试项目

2. 设置附加包含目录:我们先创建一个文件 TestMyDll.cpp(不先创建这个文件可能不会显示 C/C++ 栏目),然后右键项目属性,进入常规,点击附加包含目录,配置此处的值为刚才我们 MyDll 项目的输出目录即可(此处 $(SolutionDir) 指代解决方案目录 $Configuration 指代运行目录,建议写这个目录,相对位置在项目转移时不容易出错)。这里附件包含目录的主要意义在于,能够让程序找到我们的 MyDll.dll 文件

2. 设置附加包含目录

3. 设置附加库目录:设置这个目录的目的主要在于能够找到 MyDll.lib 文件。同样写成了 MyDll 项目的输出目录
3. 设置附件库目录

4. 设置附加依赖项:如图,我们只需要写上我们要用的静态库名称即可,即 MyDll.lib 文件
4. 设置附加依赖项

5. 别忘了还有 MyDll.h:可别忘了还要配置 MyDll.h 文件的包含目录啊 T_T (我就给忘了),同样的,在附加包含目录处进行添加(即 MyDll.dll 配置的地方)

5. MyDll.h

6. 编写测试代码:测试代码非常简单,包含 MyDll.h 头文件,使用 HelloDll 类即可

// TestMyDll.cpp#include <cstdlib>#include "MyDll.h"int main(){    HelloDll helloDll;    helloDll.hello();    system("pause");    return 0;}

四、完结:最后的撒花时刻

让我们点击生成解决方案,来看看最后的结果吧:

调用成功

五、总结

这一篇博客中,尽量做到最简的,使用 Visual Studio 2017 建立了一个解决方案,一个 Dll 动态链接库项目,一个测试调用动态链接库项目。

这个项目主要参考了两篇博客,这两篇博客已经贴在了博客引言处,不敢将这里的方法占为己有。不过还是踏了不少的坑。

另外,这里只介绍了静态调用动态链接库的方法,还有动态调用的方法还有待探索。

最后的最后,探索编写、调用动态链接库的目的当然只有一个:

我要编写自己的库啦!!!

To be Stronger!

ps: 尽管这是一个指导如何建立 DLL 项目并静态调用的例子,但是也不排除有人需要现成的项目代码进行编译研究查看的可能,这里附上本博客实验代码地址:

wangying2016/MyDll

原创粉丝点击