vs2019 + opencv生成自己的dll动态库供他人使用

4 篇文章 0 订阅
1 篇文章 0 订阅

vs2019 + opencv生成自己的dll动态库供他人使用

最近需要把自己写的工程代码编译成动态库供他人使用,于是看了好多博客,但发现其实并不是很详细,于是自己成功后想把方法保存下来供自己后面可以使用。

使用动态库需要同时用到dll和lib文件,使用的编译器是Vs2019,同时还使用了opencv,没有装opencv也可以看参考,直接把涉及到opencv的代码删除好了。

一、生成dll和lib文件

1.打开vs2019,创建一个dll文件工程。
在这里插入图片描述

2.在Dll文件夹下建立math工程,**注意:**解决方案处我未打勾,后面都是在这个基础上配的。
在这里插入图片描述

建立后的文件夹如下图所示:
在这里插入图片描述

如下图,建立后vs2019默认有这4个文件, 其中一种方法是在那几个.h和.cpp中直接粘贴代码的,在使用生成的dll时得包含头文件#include"pch.h",若有多个dll工程,这样每个工程都会有"pch.h",会造成不知道是哪个头文件。因此这里不考虑这种方法,直接忽略他们,直接往下面第5点看。

在这里插入图片描述

5.重点: 在debug x64下(也可release),直接在源文件和头文件中建立一个类,这个类名就是后续要使用的头文件名字。 我这里命名为"MathAlgorithm.h" 和 “MathAlgorithm.cpp”,把自己写的代码粘贴上去就好了。代码在后面,有需要的直接拿走。

__declspec(dllexport) 表示可以导出函数或类给其他工程调用的意思,这里定义了宏SimpleCal_API来代替它。
在这里插入图片描述

.h代码

// MathAlgorithm.h

#pragma once
#include<iostream>
#include<opencv2/opencv.hpp>


#define SimpleCal_API ;
#ifdef SimpleCal_API
#define SimpleCal_API __declspec(dllexport)
#else
#define SimpleCal_API __declspec(dllimport)
#endif

// 全局函数 使用了opencv第三方库,若没有装可以把这个函数去掉
SimpleCal_API bool testBuildOpencvDLL(cv::Mat& imgInput, cv::Mat& imgOutput);

class SimpleCal_API Mycal 
{
public:
	int my_add(int& a, int& b);

	int my_minus(int a, int b);

	int my_multiply(int a, int b);

	double my_divide(int a, int b);
};


.cpp文件

// MathAlgorithm.cpp

#include "pch.h"
#include "MathAlgorithm.h"

bool testBuildOpencvDLL(cv::Mat& imgInput, cv::Mat& imgOutput)
{
	cv::cvtColor(imgInput, imgOutput, cv::COLOR_BGR2GRAY);
	return true;
}


int Mycal::my_add(int& a, int& b) {
	return  a + b;
}

int Mycal::my_minus(int a, int b)
{
	return a - b;
}

int Mycal::my_multiply(int a, int b)
{
	return a * b;
}

double Mycal::my_divide(int a, int b)
{
	double m = (double)a / b;
	return m;
}


6.生成解决方案,可以看到生成成功了。
在这里插入图片描述

在工程文件夹的x64\Debug中可以看到成功生成的dll和lib文件,如果使用了opencv,vs也会把需要用到的相关dll复制过来。
在这里插入图片描述

二、新工程调用生成的dll和lib

1.建立一个空项目,我命名为math_use。
在这里插入图片描述

2.生成解决方案,在math_use文件夹下多了x64\Debug的文件夹。
在这里插入图片描述

记住这个文件夹:
在这里插入图片描述

3.将前面第6步生成的math.dll文件 复制到 刚刚说的文件夹中。
在这里插入图片描述

4.重点: 如下图,点击项目属性 》C/C++ 》常规 》附加包含目录,点击编辑添加 “ E:\Dll\math\math”后确定和应用。这个目录就是math工程中的.h和.cpp文件路径。
注意:未添加目录则找不到自己写的MathAlgorithm.h头文件!
在这里插入图片描述

5.链接器 》输入 》附加依赖项,点击编辑,手动添加"math.lib"后确定。
在这里插入图片描述

6.链接器 》常规 》附加库目录 》编辑,添加"E:\Dll\math\x64\Debug"后确定和应用。这个目录就是dll工程包含lib和dll文件的路径,这步的目的就是链接到math.lib。所以"E:\Dll\math\x64\Debug"目录下的math.dll文件是可以删除掉的,因为math.dll在前面已经复制到当前工程下了。
在这里插入图片描述

7.添加代码,发现可以找到自己在math工程下的头文件#include"MathAlgorithm.h"

#include<iostream>
#include"MathAlgorithm.h"
#include<opencv2/opencv.hpp> //没有opencv可以删除

int main()
{
	// + - * /
	Mycal cal;
	int a = 8, b = 2;
	int res1 = cal.my_add(a, b);
	int res2 = cal.my_minus(a, b);
	int res3 = cal.my_divide(a, b);
	int res4 = cal.my_multiply(a, b);
	std::cout << res1 << " " << res2 << " " << res3 << " " << res4 << std::endl;

	// 没有opencv可以删除掉下面9行
	cv::Mat src = cv::imread("00.bmp"), dst;
	testBuildOpencvDLL(src, dst);
	cv::namedWindow("src", cv::WINDOW_NORMAL);
	cv::namedWindow("dst", cv::WINDOW_NORMAL);
	cv::resizeWindow("src", 800, 600);
	cv::resizeWindow("dst", 800, 600);
	cv::imshow("src", src);
	cv::imshow("dst", dst);
	cv::waitKey(0);

	return 0;
}

8.运行代码,控制台输出了加减乘除的计算结果,并且将彩色图转为了灰度图。
在这里插入图片描述

小结一下:生成动态库的目的主要是让自己写的工程代码便于给其他部门或公司用,但自己写的代码使用了第三方库opencv、eigen3、arma等,因此这个前提是他人的电脑也配置好了同样的库才能使用我们生成的动态库。那他人可不可以不用安装opencv、eigen3、arma等第三方库就可以使用自己写的代码,答案是有的,时间原因有时间再写一个。
我是参考微软官网的:
创建和使用自己的动态链接库 (C++)

这是参考的博客:
VS2019编译生成动态链接库dll的两种方式
vs2017+opencv编写的代码生成dll给另一个工程使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值