1DLL的作用
DLL是一个包含可由多个程序同时使用的代码和数据的库。例如:在Windows操作系统中,Comdlg32 DLL执行与对话框有关的常见函数。因此,每个程序都可以使用该DLL中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。这篇文章的目的就是让你一次性就能了解和掌握DLL。 代码复用是提高软件开发效率的重要途径。一般而言,只要某部分代码具有通用性,就可以将它构造成相对独立的功能模块并在之后的项目中重复使用。比较常见的例子是各种应用程序框架,它们都以源代码的形式发布。由于这种复用是源代码级别的,源代码完全暴露给了程序员,因而称之为“白盒复用”。白盒复用有以下三个缺点:
1.暴露源代码,多份拷贝,造成存储浪费;
2.容易与程序员的本地代码发生命名冲突;
3.更新模块功能比较困难,不利于问题的模块化实现;
为了弥补这些不足,就提出了“二进制级别”的代码复用了。使用二进制级别的代码复用一定程度上隐藏了源代码,对于“黑盒复用”的途径不只DLL一种,静态链接库,甚至更高级的COM组件都是。
使用DLL主要有以下优点:
1.使用较少的资源;当多个程序使用同一函数库时,DLL可以减少在磁盘和物理内存中加载的代码的重复量。这不仅可以大大影响在前台运行的程序,而且可以大大影响其它在Windows操作系统上运行的程序;
2.推广模块式体系结构;
3.简化部署与安装。
2动态链接库和静态链接库的区别
函数库分为静态库和动态库两种。 静态库在程序编译时会被连接到目标代码中,程序运行时将不再需要该静态库。
动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入,因此在程序运行时还需要动态库存在。
3显示链接和隐式链接的区别
隐式链接指将DLL的函数符号输出库LIB链接,在执行文件中IMPORT段加入一系列函数的入口点!程序在加载启动时自动加载这些DLL,并查找函数入口点!像普通的SDK程序要加入KERNEL32。LIB链接就是!这样的方法是当使用DLL多时,程序启动很慢、! 动态链接指显式加载DLL,利用LoadLibrary,GetProcAddress取得函数入口点,执行再释放,这种方法是程序简洁,快速!但是不利于输出太多函数的DLL使用!代码量太大!
4实例演示在C++中如何生成含有OpenCV库的dll文件
本实例是基于vs2017和OpenCV4.0.1(可以参考使用 代码亲测可行)
可以参考 https://blog.csdn.net/m0_37170593/article/details/76445972
(1)创建动态链接库(OpenCVDll1)
1.1创建dll项目
1.2添加头文件(OpenCVDll1.h)
1.3配置结果
1.4 在OpenCVDll1.h文件中添加申明要导出的函数
1 #pragma once 2 #include <iostream> 3 #include <opencv2/opencv.hpp> 4 #include <opencv2/core.hpp> 5 6 using namespace std; 7 using namespace cv; 8 9 __declspec(dllexport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导出接口 即此函数是导出的 10 __declspec(dllimport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导入接口 即此函数是导入的
1.5在OpenCVDll1.cpp文件中实现函数 注意 要在OpenCVDll1.cpp中添加OpenCVDll1.h
1 #include "stdafx.h" 2 #include <iostream> 3 #include "OpenCVDll1.h" 4 5 6 void threshold_processimage(Mat &inputimgage, Mat &outputimgage) 7 { 8 Mat src = inputimgage; 9 cvtColor(inputimgage, inputimgage, COLOR_BGR2GRAY); 10 threshold(inputimgage, inputimgage, 20, 255, THRESH_BINARY_INV); 11 outputimgage = inputimgage; 12 }
1.6生成解决方案
1.7生成结果
(2)加载动态链接库
2.1新建一个c++项目
2.2将OpenCVdll文件中的三个文件导入至OpenCVtest文件夹中
OpenCVdll中三个文件位置
导入到OpenCVtest中
2.3项目中分别添加
(3)验证动态链接库
#include "pch.h"
#include <iostream>
#include "OpenCVDll1.h"
int main()
{
Mat outputimage;
Mat inputimage = imread("01.jpg");
imshow("显示原图", inputimage);
threshold_processimage(inputimage, outputimage);//此函数是dll中的
imshow("二值化图", outputimage);
waitKey(0);
return 0;
}