VS2010建立並使用動態連結庫(.dll)
動態連結庫不能直接執行,也不能接收訊息。它是一個獨立的檔案,包含能被可執行程式或其他DLL來呼叫其函式完成某項工作。
只有在其他模組呼叫動態連結庫中的函式時,動態連結庫才發揮作用。在實際程式設計中,可以把完成某種功能的函式放在一個動態連結庫中,
提供給其他程式呼叫。使用 DLL 是一種重用程式碼的絕佳方式。 您不必在自己建立的每個程式中重新實現同一例程,而只需對這些例程編寫一次,
然後從需要該功能的應用程式引用它們即可。
靜態庫(.LIB):
靜態連結庫中的所有指令全部被包含在最終生成的可執行檔案(.EXE)中。釋出可執行檔案時,不需要釋出靜態連結庫。
動態庫(.lib和.dll):
動態連結庫一般包含兩個檔案
DLL檔案包含實際的函式和資料。在使用動態庫進行編譯連線時,只需要連結引入庫檔案。當可執行程式執行時,需要動態庫中的某個函式時,
才去載入所需的DLL,將DLL對映到程序的地址空間中,然後訪問DLL中的匯出的函式。釋出產品時,除了釋出可執行檔案,還要同時釋出該程式中將要呼叫的動態連結庫。
製作Dll檔案:
1.檔案--專案--Win32 控制檯程式
2.名稱:MathFuncsDll
解決方案名稱:DynamicLibrary
3.應用程式型別--DLL、空專案
4.新建
.h檔案----新增MyMathFuns類,程式如下:注:namespace MathFuncs { class MyMathFuncs { public: ///Return a+b <span style="color:#ff0000;">static _declspec(dllexport)</span> double Add(double a,double b); ///Return a-b static _declspec(dllexport) double Subtract(double a,double b); ///Return a*b static _declspec(dllexport) double Multiply(double a,double b); ///Return a/b static _declspec(dllexport) double Divide(double a,double b); ///注:_declspec(dllexport)修飾符:使DLL能夠匯出該方法以供其他應用程式使用 }; }
__declspec(dllexport) 修飾符:使 DLL 能夠匯出該方法以供其他應用程式使用。
5.新建.cpp檔案:
#include "MathFuncsDll.h" #include <stdexcept> using namespace std; namespace MathFuncs { double MyMathFuncs::Add(double a,double b) { return a+b; } double MyMathFuncs::Subtract(double a,double b) { return a-b; } double MyMathFuncs::Multiply(double a,double b) { return a*b; } double MyMathFuncs::Divide(double a,double b) { if(b==0) { throw new invalid_argument("b cannot be zero!"); } return a/b; } }
6.專案--屬性--配置屬性--常規--配置型別--.dll
7.生成解決方案。此時,在專案資料夾下新增了Debug資料夾,資料夾中包含新生成的.dll/.lib等檔案。
在程式中呼叫DLL檔案:
此方法即新增OpenCV動態連結庫的方法。
步驟:
1.將.h/.lib/.dll複製到工程資料夾中
例:
Project->xxxSystem(解決方案)->xxxSystem(專案)->.h
Project->xxxSystem(解決方案)->Debug->.lib/.dll
2.專案→屬性→VC++目錄→庫目錄→新增.lib檔案的絕對地址
或:在解決方案--右鍵--新增--.lib/.dll
3.新增標頭檔案
例:在xxxxxx.cpp中用到,則
#include "MyMathFuncs.h"
……
void Cxxxxxx::OnBnClickedButton1()
{
CString str;
doublea = 7.4,c;
int b =99;
c=MathFuncs::MyMathFuncs::Add(a,b);
str.Format("a+b=%lf",c);
MessageBox(str);
}