两个月后才更新一篇。。。。LIB和DLL的差别
共同擁有兩種庫:
一種是LIB包括了函數(shù)所在的DLL文件和文件里函數(shù)位置的信息(入口)。代碼由執(zhí)行時載入在進(jìn)程空間中的DLL提供,稱為動態(tài)鏈接庫dynamic link library。
一種是LIB包括函數(shù)代碼本身。在編譯時直接將代碼增加程序其中,稱為靜態(tài)鏈接庫static link library。
共同擁有兩種鏈接方式:
動態(tài)鏈接使用動態(tài)鏈接庫,同意可運(yùn)行模塊(.dll文件或.exe文件)僅包括在運(yùn)行時定位DLL函數(shù)的可運(yùn)行代碼所需的信息。
靜態(tài)鏈接使用靜態(tài)鏈接庫,鏈接器從靜態(tài)鏈接庫LIB獲取全部被引用函數(shù),并將庫同代碼一起放到可運(yùn)行文件里。
關(guān)于lib和dll的差別例如以下:
(1)lib是編譯時用到的,dll是執(zhí)行時用到的。假設(shè)要完畢源碼的編譯。僅僅須要lib。假設(shè)要使動態(tài)鏈接的程序執(zhí)行起來。僅僅須要dll。
(2)假設(shè)有dll文件,那么lib通常是一些索引信息,記錄了dll中函數(shù)的入口和位置,dll中是函數(shù)的詳細(xì)內(nèi)容;假設(shè)僅僅有l(wèi)ib文件,那么這個lib文件是靜態(tài)編譯出來的。索引和實現(xiàn)都在當(dāng)中。
使用靜態(tài)編譯的lib文件,在執(zhí)行程序時不須要再掛動態(tài)庫。缺點(diǎn)是導(dǎo)致應(yīng)用程序比較大,并且失去了動態(tài)庫的靈活性。公布新版本號時要公布新的應(yīng)用程序才行。
(3)動態(tài)鏈接的情況下,有兩個文件:一個是LIB文件。一個是DLL文件。
LIB包括被DLL導(dǎo)出的函數(shù)名稱和位置。DLL包括實際的函數(shù)和數(shù)據(jù)。應(yīng)用程序使用LIB文件鏈接到DLL文件。在應(yīng)用程序的可運(yùn)行文件里,存放的不是被調(diào)用的函數(shù)代碼。而是DLL中對應(yīng)函數(shù)代碼的地址,從而節(jié)省了內(nèi)存資源。DLL和LIB文件必須隨應(yīng)用程序一起發(fā)行。否則應(yīng)用程序會產(chǎn)生錯誤。假設(shè)不想用lib文件或者沒有l(wèi)ib文件。能夠用WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載。
使用lib需注意兩個文件:
(1).h頭文件,包括lib中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)。應(yīng)用程序調(diào)用lib時,須要將該文件包括入應(yīng)用程序的源文件里。
(2).LIB文件,略。
使用dll需注意三個文件:
(1).h頭文件,包括dll中說明輸出的類或符號原型或數(shù)據(jù)結(jié)構(gòu)的.h文件。應(yīng)用程序調(diào)用dll時。須要將該文件包括入應(yīng)用程序的源文件里。
(2).LIB文件。是dll在編譯、鏈接成功之后生成的文件。作用是當(dāng)其它應(yīng)用程序調(diào)用dll時。須要將該文件引入應(yīng)用程序,否則產(chǎn)生錯誤。假設(shè)不想用lib文件或者沒有l(wèi)ib文件。能夠用WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載。
(3).dll文件,真正的可運(yùn)行文件,開發(fā)成功后的應(yīng)用程序在公布時。僅僅須要有.exe文件和.dll文件,并不須要.lib文件和.h頭文件。
使用lib的方法:
靜態(tài)lib中,一個lib文件實際上是隨意個obj文件的集合,obj文件是cpp文件編譯生成的。在編譯這樣的靜態(tài)庫project時,根本不會遇到鏈接錯誤;即使有錯,也僅僅會在使用這個lib的EXT文件或者DLLproject里暴露出來。
在VC中新建一個static library類型的projectLib,增加test.cpp文件和test.h文件(頭文件內(nèi)包含函數(shù)聲明)。然后編譯,就生成了Lib.lib文件。
別的project要使用這個lib有兩種方式:
(1)在project->link->Object/Library Module中增加Lib.lib文件(先查詢工程文件夾。再查詢系統(tǒng)Lib文件夾);或者在源碼中增加指令#pragma comment(lib, “Lib.lib”)。
(2)將Lib.lib拷入project所在文件夾?;蛘哌\(yùn)行文件生成的文件夾,或者系統(tǒng)Lib文件夾中。
(3)增加對應(yīng)的頭文件test.h。
使用DLL的方法:
使用動態(tài)鏈接中的lib,不是obj文件的集合,即里面不會有實際的實現(xiàn),它僅僅是提供動態(tài)鏈接到DLL所須要的信息,這樣的lib能夠在編譯一個DLLproject時由編譯器生成。
創(chuàng)建DLLproject的方法(略)。
(1)隱式鏈接
第一種方法是:通過project->link->Object/Library Module中增加.lib文件(或者在源碼中增加指令#pragma comment(lib, “Lib.lib”)),并將.dll文件置入工程所在文件夾,然后增加相應(yīng)的.h頭文件。
#include?"DLLSample.h"
#pragma?comment(lib,?"DLLSample.lib")????//你也能夠在項目屬性中設(shè)置庫的鏈接
int?main()
{
????????TestDLL(123);???//dll中的函數(shù)。在DllSample.h中聲明
????????return(1);
}
(2)顯式鏈接
須要函數(shù)指針和WIN32 API函數(shù)LoadLibrary、GetProcAddress裝載,使用這樣的加載方法,不須要.lib文件和.h頭文件,僅僅須要.dll文件就可以(將.dll文件置入project文件夾中)。
#include?<windows.h>?????????//使用函數(shù)和某些特殊變量
typedef?void?(*DLLFunc)(int);
int?main()
{
????????DLLFunc?dllFunc;
????????HINSTANCE?hInstLibrary?=?LoadLibrary("DLLSample.dll");
????????if?(hInstLibrary?==?NULL)
????????{
??????????FreeLibrary(hInstLibrary);
????????}
????????dllFunc?=?(DLLFunc)GetProcAddress(hInstLibrary,?"TestDLL");
????????if?(dllFunc?==?NULL)
????????{
??????????FreeLibrary(hInstLibrary);
????????}
????????dllFunc(123);
????????std::cin.get();
????????FreeLibrary(hInstLibrary);
????????return(1);
}
LoadLibrary函數(shù)利用一個名稱作為參數(shù),獲得DLL的實例(HINSTANCE類型是實例的句柄),通常調(diào)用該函數(shù)后須要查看一下函數(shù)返回是否成功,假設(shè)不成功則返回NULL(句柄無效),此時調(diào)用函數(shù)FreeLibrary釋放DLL獲得的內(nèi)存。
GetProcAddress函數(shù)利用DLL的句柄和函數(shù)的名稱作為參數(shù),返回對應(yīng)的函數(shù)指針。同一時候必須使用強(qiáng)轉(zhuǎn);推斷函數(shù)指針是否為NULL,假設(shè)是則調(diào)用函數(shù)FreeLibrary釋放DLL獲得的內(nèi)存。此后,能夠使用函數(shù)指針來調(diào)用實際的函數(shù)。
最后要記得使用FreeLibrary函數(shù)釋放內(nèi)存。
注意:應(yīng)用程序怎樣找到DLL文件?
使用LoadLibrary顯式鏈接。那么在函數(shù)的參數(shù)中能夠指定DLL文件的完整路徑。假設(shè)不指定路徑,或者進(jìn)行隱式鏈接。Windows將遵循以下的搜索順序來定位DLL:
(1)包括EXE文件的文件夾
(2)project文件夾
(3)Windows系統(tǒng)文件夾
(4)Windows文件夾
(5)列在Path環(huán)境變量中的一系列文件夾
轉(zhuǎn)載于:https://www.cnblogs.com/mthoutai/p/6886092.html
總結(jié)
以上是生活随笔為你收集整理的两个月后才更新一篇。。。。LIB和DLL的差别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bzoj1095: [ZJOI2007]
- 下一篇: VS2017 Cordova Ionic