封装DLL---生成具有导出项的动态链接库

封装DLL—生成具有导出项的动态链接库

具有导出项的意思是同时生成dll和lib文件,lib文件提供函数的入口,dll包含函数的内容和地址。通过这样的方式可以将自己的代码封装起来供别人使用。如在vs中可以添加附加依赖项将lib添加到项目中,在项目中包含头文件,编译执行即可。(例如在学习cv领域的opencv时需要配置的过程基本一致)

1 环境

Windows11+vs2017(win7以上和vs2015以上的系列方法大致相似)

2 新建vs项目

打开vs,选择“具有可导出项的动态链接库”,在下方输入名称,这个名称也是头文件的名称。例如封装的是一个具有四则运算方法的类,那么名称起为CaculateNum。

在这里插入图片描述

点击“确定”即可生成项目,需要做的就是在CaculateNum.h文件中声明类和方法,在.cpp文件中实现这些类的接口。

在这里插入图片描述

在.h文件中自动根据项目名称生成了类名,以及自动生成的一个变量和函数示例。其中类名可修改、变量和函数可以删除。

在这里插入图片描述

了解之后可以实现自己的类。实现如下:为了增加鲁棒和可读性添加了命名空间和模板方法以及示例。

.h文件的修改如下:

在这里插入图片描述

.cpp的修改如下:在.cpp中实现类的方法。
在这里插入图片描述

文章末尾给出.h以及.cpp的代码。

3 编译生成lib和dll

在写好代码之后,修改配置和发布平台,这里使用release x64,接着点击“生成”—“生成解决方案”,即可编译项目,

在这里插入图片描述

成功之后在文件项目的发布平台文件夹下中找到dll和lib文件并复制,

在这里插入图片描述

之后找到.h文件并复制。

在这里插入图片描述

4 在其他项目中使用

把复制的文件粘贴新建的工程里,

在这里插入图片描述

配置lib文件,

在这里插入图片描述

也可以添加头文件到项目中(或者在项目“属性”中添加包含目录),然后引用头文件,之后就可以正常使用了。

在这里插入图片描述

输出结果如下:

在这里插入图片描述

结尾

.h源码

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 CACULATENUM_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// CACULATENUM_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef CACULATENUM_EXPORTS
#define CACULATENUM_API __declspec(dllexport)
#else
#define CACULATENUM_API __declspec(dllimport)
#endif

//可以添加命名空间
namespace Caculating {

	// 此类是从 dll 导出的
	class CACULATENUM_API CaculateNum {
	public:
		CaculateNum(void);
		// TODO: 在此处添加方法。

		template<typename ADD>
		ADD add(ADD a, ADD b);

		template<typename SUB>
		SUB sub(SUB a, SUB b);
		
	};
}

.cpp源码

// CaculateNum.cpp : 定义 DLL 的导出函数。

#include "pch.h"
#include "framework.h"
#include "CaculateNum.h"

namespace Caculating {

	// 这是已导出类的构造函数。
	CaculateNum::CaculateNum()
	{
		return;
	}

	template<typename ADD>
	ADD CaculateNum::add(ADD a, ADD b) {
		return a + b;
	}

	template<typename SUB>
	SUB CaculateNum::sub(SUB a, SUB b) {
		return a - b;
	}

}

template CACULATENUM_API int Caculating::CaculateNum::add(int a, int b);
template CACULATENUM_API float Caculating::CaculateNum::add(float a, float b);
template CACULATENUM_API double Caculating::CaculateNum::add(double a, double b);

template CACULATENUM_API int Caculating::CaculateNum::sub(int a, int b);
template CACULATENUM_API float Caculating::CaculateNum::sub(float a, float b);
template CACULATENUM_API double Caculating::CaculateNum::sub(double a, double b);
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
封装一个C语言动态链接库(DLL),需要进行以下步骤: 1. 创建一个新的C语言目,将需要封装的函数实现在该目中。 2. 在目属性中,将输出类型设置为DLL。 3. 编译目,生成DLL文件。 4. 创建一个包含需要调用DLL函数的头文件的目。 5. 在该目中包含DLL的头文件,链接DLL库,并调用其中的函数。 下面是一个简单的示例: ```c // 封装的函数,将两个整数相加 int add(int a, int b){ return a + b; } ``` 在Visual Studio中,创建新目时可以选择DLL目类型,也可以创建普通C语言目后,进入目属性->配置属性->常规,将输出类型改为DLL。 在生成DLL后,需要将生成DLL文件和头文件提供给其他开发人员使用。其他开发人员只需要包含头文件,并在链接时链接DLL库即可调用函数。例如: ```c #include <stdio.h> #include "mydll.h" // 封装DLL的头文件 void main(){ int a = 1, b = 2; int result = add(a, b); // 调用封装的函数 printf("%d + %d = %d\n", a, b, result); } ``` 在链接时需要将DLL库链接进来,可以在Visual Studio中将DLL库添加到链接器->输入->附加依赖中,或者使用命令行参数-l来链接库。例如: ``` gcc main.c mydll.lib -o main ``` 需要注意的是,封装DLL时需要考虑函数的可见性,一般使用__declspec(dllexport)来声明需要导出的函数。例如: ```c __declspec(dllexport) int add(int a, int b){ return a + b; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值