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