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文件中添加申明要导出的函数

 #pragma once
#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp> using namespace std;
using namespace cv; __declspec(dllexport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导出接口 即此函数是导出的
__declspec(dllimport) void threshold_processimage(Mat &inputimgage, Mat &outputimgage);//函数导入接口 即此函数是导入的

1.5在OpenCVDll1.cpp文件中实现函数  注意 要在OpenCVDll1.cpp中添加OpenCVDll1.h

 #include "stdafx.h"
#include <iostream>
#include "OpenCVDll1.h" void threshold_processimage(Mat &inputimgage, Mat &outputimgage)
{
Mat src = inputimgage;
cvtColor(inputimgage, inputimgage, COLOR_BGR2GRAY);
threshold(inputimgage, inputimgage, , , THRESH_BINARY_INV);
outputimgage = inputimgage;
}

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;
}

  

【1】基于OpenCV的DLL动态库隐式连接的更多相关文章

  1. .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper

    .NET 使用 MySql.Data.dll 动态库操作MySql的帮助类--MySqlHelper 參考演示样例代码,例如以下所看到的: /// <summary> /// MySql ...

  2. Java调用dll动态库

    最近项目里使用java调用dll动态库,因此研究了一下这方面的东西. 使用的工具包如下 <dependency> <groupId>net.java.dev.jna</g ...

  3. Eclipse下生成.dll动态库及.a静态库使用 for Windows [z]

    以后的主要工作就是做库了,将我们的C或者C++写的接口做成库,给客户端使用,因此有必要知道库的使用和制作方法.主要是在Eclipse下搞了搞,公司用的是Carbide,也差不多.库做好了,用SVN已提 ...

  4. Golang调用windows下的dll动态库中的函数

    Golang调用windows下的dll动态库中的函数 使用syscall调用. package main import ( "fmt" "syscall" & ...

  5. 2017.10.29 C/C++/C#程序如何打成DLL动态库

    C/C++程序如何打成DLL动态库: **1.在VS中新建main.h,添加如下内容:** extern "C" _declspec(dllexport) int onLoad() ...

  6. C/C++/C#程序如何打成DLL动态库

    C/C++程序如何打成DLL动态库:1.在VS中新建main.h,添加如下内容:extern "C" _declspec(dllexport) int onLoad(); 2.新建 ...

  7. Delphi调用C# 编写dll动态库

    Delphi调用C# 编写dll动态库 编写C#dll的方法都一样,首先在vs2005中创建一个“类库”项目WZPayDll, using System.Runtime.InteropServices ...

  8. java使用JNA框架调用dll动态库

    这两天了解了一下java调用dll动态库的方法,总的有三种:JNI.JNA.JNative.其中JNA调用DLL是最方便的. ·JNI ·JNA ·JNative java使用 JNI来调用dll动态 ...

  9. Delphi - Windows系统下,Delphi调用API函数和7z.dll动态库,自动把文件压缩成.tar.gz格式的文件

    项目背景 应欧美客户需求,需要将文件压缩成.tar.gz格式的文件,并上传给客户端SFTP服务器. 你懂的,7-Zip软件的显著特点是文件越大压缩比越高,在Linux系统上相当于我们Windows系统 ...

随机推荐

  1. MySQL CRUD使用之小总结

    总结一下最近碰到的一些关于MySQL CRUD方面的语句. 在使用pymysql的executemany方法时,需要注意的几个问题: 1.在写sql语句时,不管字段为什么类型,占位符统一使用%s,且不 ...

  2. 2019-2020-1 20199304《Linux内核原理与分析》第九周作业

    第八章 进程的切换和系统的一般执行过程 知识点 1.进程调度的时机 1.1硬中断和软中断 中断是指在计算机执行期间,系统内发生任何非寻常的或非预期的急需处理事件,使得CPU暂时中断当前正在执行的程序而 ...

  3. 暗灰色的圆形按钮.html

    宝宝 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title& ...

  4. 开发者如何学好 MongoDB

    作为一名研发,数据库是或多或少都会接触到的技术. MongoDB 是当前火热的 NoSQL 之一,我们怎样才能学好 MongoDB 呢?本篇文章,我们将从以下几方面讨论这个话题: MongoDB 是什 ...

  5. 让微信推送Jenkins构建消息

    Jenkins作为开发必备之神器,各家大小公司都在使用.Jenkins自身内置了基于邮件推送构建结果的功能.但是随着移动互联网的发展,邮件这玩意已经越来越少使用了,是否有一种办法能把jenkins构建 ...

  6. HTTP/2简介

    1.HTTP/2的定义: HTTP/2即超文本传输协议2.0,是HTTP/1.1下一代的协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (htt ...

  7. vue 常用的官网

    vue.js     https://cn.vuejs.org/ v-charts  https://v-charts.js.org/#/                    (图表,地图) web ...

  8. Asp.net MVC + AngularJS 统一权限管理系统(一)

    背景: 之前公司内部做了不少系统,但是权限管理都是分开的:一直都想能够有一套统一管理的权限管理系统:有的时间都是一直在计划,随着时间的流逝,计划始终没有实现,也随着项目的增多而这权限管理也变得版本多样 ...

  9. 免费PPT模板

    第1PPT网站:第1PPT网站链接,大量PPT免费模板,可免费下载,而且模板大多质量挺高的,亲测可用~~

  10. InputStream 读取中文乱码 扩展

    对于InputStream读取中文乱码,下面这段话给出了很好的解释,以及后续编码上的扩展. BufferedInputStream和BufferedOutputStream是过滤流,需要使用已存在的节 ...