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

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

<1> 生成动态链接库:

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

详述C++ 调用opencv编译成dll并调用的全过程_第1张图片

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

详述C++ 调用opencv编译成dll并调用的全过程_第2张图片

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

详述C++ 调用opencv编译成dll并调用的全过程_第3张图片

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

详述C++ 调用opencv编译成dll并调用的全过程_第4张图片

#pragma once
#include 
#include 
#include 
#include 
#include 

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文件--添加

详述C++ 调用opencv编译成dll并调用的全过程_第5张图片

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

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

详述C++ 调用opencv编译成dll并调用的全过程_第6张图片

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

7、编译

详述C++ 调用opencv编译成dll并调用的全过程_第7张图片

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

<2> 配置OpenCV:

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

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

1、 项目--属性

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

详述C++ 调用opencv编译成dll并调用的全过程_第8张图片

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

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

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

  点击确定

详述C++ 调用opencv编译成dll并调用的全过程_第9张图片

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

详述C++ 调用opencv编译成dll并调用的全过程_第10张图片

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

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

   点击确定

详述C++ 调用opencv编译成dll并调用的全过程_第11张图片

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

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

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

  一路点击确定

详述C++ 调用opencv编译成dll并调用的全过程_第12张图片

详述C++ 调用opencv编译成dll并调用的全过程_第13张图片

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

<3> 调用动态链接库:

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

详述C++ 调用opencv编译成dll并调用的全过程_第14张图片

 2、调用DLL

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

详述C++ 调用opencv编译成dll并调用的全过程_第15张图片

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

PS:  打开之前的dll1.sln

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

详述C++ 调用opencv编译成dll并调用的全过程_第16张图片

详述C++ 调用opencv编译成dll并调用的全过程_第17张图片

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

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

详述C++ 调用opencv编译成dll并调用的全过程_第18张图片

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

详述C++ 调用opencv编译成dll并调用的全过程_第19张图片

详述C++ 调用opencv编译成dll并调用的全过程_第20张图片

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

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

#pragma once
#pragma comment(lib,"Dll1.lib")
#include 
#include 
#include 
#include 
#include 

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文件即可

你可能感兴趣的:(c++,opencv)