【1】基於OpenCV的DLL動態庫隱式連接


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

  

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM