简单 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 测试项目的
2. 添加一个新项目 MyDll:这个项目就是我们的动态链接库项目
3. 设置项目属性:在弹出来的应用程序设置中,应用程序类型选择 DLL
,附件选项选择 空项目
,然后点击完成
即可
4. 查看 dll/lib 等文件的输出目录:这里,我们右键项目属性,在常规
中点击 输出目录
,可以看到我们将要输出的 MyDll.dll 和 MyDll.lib 文件的输出目录,这个目录将在后面测试项目中使用
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
。这样做的目的是方便我们定义我们的类或者函数的导入导出定义。
然后,我们就像普通的类实现一样,实现我们的自定义库类实现:
// MyDll.cpp#include <iostream>#include "MyDll.h"void HelloDll::hello(){ std::cout << "hello, this is my dll ^_^ " << std::endl;}
6. 编译、运行:现在可以编译我们的项目,记得如上图一样,在预处理器的地方定义自己的预定义编译宏 MY_DLL_EXPORTS
,如果你配置正确了的话,应该可以看到如图内容:
三、MyTestDll:测试我们的动态链接库(静态链接)
接下来,我们来静态链接我们的动态链接库。
1. 新添加一个测试项目:此时选择空项目即可,毕竟只需要运行一个 main 函数即可
2. 设置附加包含目录:我们先创建一个文件 TestMyDll.cpp(不先创建这个文件可能不会显示 C/C++ 栏目),然后右键项目属性,进入常规,点击附加包含目录,配置此处的值为刚才我们 MyDll 项目的输出目录即可(此处 $(SolutionDir)
指代解决方案目录 $Configuration
指代运行目录,建议写这个目录,相对位置在项目转移时不容易出错)。这里附件包含目录的主要意义在于,能够让程序找到我们的 MyDll.dll 文件
3. 设置附加库目录:设置这个目录的目的主要在于能够找到 MyDll.lib 文件。同样写成了 MyDll 项目的输出目录
4. 设置附加依赖项:如图,我们只需要写上我们要用的静态库名称即可,即 MyDll.lib 文件
5. 别忘了还有 MyDll.h:可别忘了还要配置 MyDll.h 文件的包含目录啊 T_T (我就给忘了),同样的,在附加包含目录处进行添加(即 MyDll.dll 配置的地方)
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
- 简单Demo:动态调用自己编写的动态链接库
- 简单 Demo:C++编写、调用动态链接库
- ctypes: 使用python调用C编写的动态链接库
- C和C++编写、调用动态链接库的方法
- 简单动态链接库的 Demo
- VS2013 编写调用 动态链接库
- VS2013编写和调用动态链接库
- C#编写和调用动态链接库
- C++_编写动态链接库
- C++_编写动态链接库
- C++_编写动态链接库
- 用C/C++编写与调用动态链接库(DLL)文件
- 用C/C++编写与调用动态链接库(DLL)文件
- C语言编写DLL动态链接库并分别用VB和Python调用
- Java调用C/C++编写的第三方dll动态链接库
- Delphi 调用 c编写的动态链接库,结构体指针作为参数
- java调用c/c++编写的第三方dll动态链接库
- JNI技术之Java调用C/C++编写的第三方dll-动态链接库
- 【OpenStack源码分析之四】WSGI与Nova API服务启动
- 811A
- HLS实现bayer to RGB 转换
- hdu 1535 Invitation Cards spfa求最短路,反向建图再来一次
- Python 通配符删除文件
- 简单 Demo:C++编写、调用动态链接库
- 面向对象
- 学以致用——ikb知识库英文词条词频分析-Part2-大数据中高频词分析(Spotfire)
- poj-2801-填词-C语言-简单计算
- 关于Guideline 4.3
- js控制上传文件的大小
- 入离职管理系统——类的抽取和注册登录功能
- 深度学习笔记——理论与推导之Neural Network的记忆力(四)
- Java提高篇——通过分析 JDK 源代码研究 Hash 存储机制