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

