详述C++ 调用opencv编译成dll并调用的全过程

本篇详述的是在Vs2019+OpenCV环境下生成动态链接库DLL并加以调用的全过程

<1> 生成动态链接库:

1、Vs创建新项目 --> 动态链接库(DLL)

2、 下一步 --> (填写自己的项目名称,选择自己的项目位置) 创建

3、头文件--添加--新建项--.h文件--添加

 4、编辑.h文件(例:我生成的 Test.h)

#pragma once
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <iostream>

using namespace std;
using namespace cv;

extern "C" __declspec(dllexport) void thresholdIntegral(Mat inputMat, Mat outputMat);

 其中,extern "C":告诉编译器将被它修饰的代码按C语言的方式进行编译。
            __declspec(dllexport):告诉编译器和链接器被它修饰的函数或变量需要从DLL导出,以供其他应用程序使用;与其相对的还有一句代码是__declspec(dllimport),此修饰符的作用是告诉编译器和链接器被它修饰的函数或变量需要从DLL导入,它在后面也会被用到。
           void thresholdIntegral(Mat inputMat, Mat outputMat):就是需要被其他程序调用的函数。 (此处解释来源于CSDN博主「Aishen1024」的原创文章,原文链接:https://blog.csdn.net/qq_30139555/article/details/103621955)

5、源文件--添加--新建项--.cpp文件--添加

 6、编辑.cpp文件(例:我生成的 Test.cpp)

        记得一定要在最上面添加 #include "pch.h"

 至此,DLL的代码编写完成。

7、编译

显示成功就可以了。上面的提示信息没有关系,因为这个是dll,不是.exe应用程序,本身就是无法被启动的。单击确定,忽视即可。

<2> 配置OpenCV:

上述操作之后,会发现关于opencv库的头都在报错,配置好opencv就没事了。

首先我一直使用的都是 debug x64的平台

1、 项目--属性

 1)VC++目录--包含目录--编辑

  将您下载的opencv路径下的两个路径添加进去:

        D:\Program Files\Visual studio 2019\OpenCV\opencv\build\include

        D:\Program Files\Visual studio 2019\OpenCV\opencv\build\include\opencv2

  点击确定

2)VC++目录--库目录--编辑

   将您下载的opencv路径下的一个路径添加进去:

        D:\Program Files\Visual studio 2019\OpenCV\opencv\build\x64\vc15\lib

   点击确定

 3)链接器--输入--附加依耐项--编辑

   将您下载的opencv路径下的opencv_worldxxxd.lib添加进去,它的路径就是您刚刚添加到库目录的路径:

        D:\Program Files\Visual studio 2019\OpenCV\opencv\build\x64\vc15\lib

  一路点击确定

 以上opencv就全部配置完成了。

<3> 调用动态链接库:

1、新建一个C++工程项目(例:DllTest),也需按<2>配置好opencv

 2、调用DLL

    1)将刚刚Dll1的生成工程目录下的x64\Debug文件夹中的“Dll1.dll”和“Dll1.lib”文件复制到"DllTest\DllTest"文件夹中。

这个时候问题来了,发现我们的生成的只有dll文件,却缺少相对应的lib文件,那么要解决一下这个问题了。

PS:  打开之前的dll1.sln

在工程上右键 -> 添加 -> 新建项 -> 选"模块定义文件(.def)" -> 随便输入个名字 -> 添加

 添加完成后,直接编译,再打开文件夹,会发现有相对应lib文件了

    2)将刚刚Dll1的生成工程目录下的x64\Debug文件夹中的“Dll1.dll”和“Dll1.lib”文件复制到"DllTest\DllTest"文件夹中。

    3)将刚刚Dll1的生成工程目录下的Dll1\Dll1文件夹中的“Test.h”文件复制到"DllTest\DllTest"文件夹中。

    4)对新建的C++工程(Adaptive),头文件--添加--现有项

添加了Test.h之后。编辑Test.h文件

#pragma once
#pragma comment(lib,"Dll1.lib")
#include <opencv2/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/imgproc_c.h>
#include <iostream>

using namespace cv;

extern "C" __declspec(dllimport) void thresholdIntegral(Mat inputMat, Mat outputMat);

首先,添加一行代码:#pragma comment(lib,"xxx.lib"),它的作用是将您的“xxx.dll”链接到您的工程项目中;
然后,extern "C" __declspec(dllexport) 修改为 extern "C" __declspec(dllimport) ,它的作用是告诉编译器和链接器被__declspec(dllimport)修饰的函数或变量需要从DLL导入。

    5)编写需调用dll的cpp文件即可

猜你喜欢

转载自blog.csdn.net/weixin_44888196/article/details/127211083