DLL文件的知識(shí)點(diǎn):什么是動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library)?
DLL文件的知識(shí)點(diǎn):什么是動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library)?
DLL(Dynamic Link Library)文件為動(dòng)態(tài)鏈接庫(kù)文件,又稱(chēng)“應(yīng)用程序拓展”,是軟件文件類(lèi)型。在Windows中,許多應(yīng)用程序并不是一個(gè)完整的可執(zhí)行文件,它們被分割成一些相對(duì)獨(dú)立的動(dòng)態(tài)鏈接庫(kù),即DLL文件,放置于系統(tǒng)中。當(dāng)我們執(zhí)行某一個(gè)程序時(shí),相應(yīng)的DLL文件就會(huì)被調(diào)用。一個(gè)應(yīng)用程序可使用多個(gè)DLL文件,一個(gè)DLL文件也可能被不同的應(yīng)用程序使用,這樣的DLL文件被稱(chēng)為共享DLL文件。DLL文件中存放的是各類(lèi)程序的函數(shù)(子過(guò)程)實(shí)現(xiàn)過(guò)程,當(dāng)程序需要調(diào)用函數(shù)時(shí)需要先載入DLL,然后取得函數(shù)的地址,最后進(jìn)行調(diào)用。使用DLL文件的好處是程序不需要在運(yùn)行之初加載所有代碼,只有在程序需要某個(gè)函數(shù)的時(shí)候才從DLL中取出。另外,使用DLL文件還可以減小程序的體積。
動(dòng)態(tài)鏈接庫(kù)(Dynamic Link Library 或者 Dynamic-link Library,縮寫(xiě)為 DLL),是微軟公司在微軟Windows操作系統(tǒng)中,實(shí)現(xiàn)共享函數(shù)庫(kù)概念的一種方式。這些庫(kù)函數(shù)的擴(kuò)展名是".dll"、".ocx"(包含ActiveX控制的庫(kù))或者 ".drv"(舊式的系統(tǒng)驅(qū)動(dòng)程序)。介紹:動(dòng)態(tài)鏈接提供了一種方法,使進(jìn)程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個(gè) DLL 文件中,該 DLL 包含一個(gè)或多個(gè)已被編譯、鏈接并與使用它們的進(jìn)程分開(kāi)存儲(chǔ)的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個(gè)應(yīng)用程序可同時(shí)訪問(wèn)內(nèi)存中單個(gè) DLL 副本的內(nèi)容。使用動(dòng)態(tài)鏈接庫(kù)可以更為容易地將更新應(yīng)用于各個(gè)模塊,而不會(huì)影響該程序的其他部分。例如,您有一個(gè)大型網(wǎng)絡(luò)游戲,如果把整個(gè)數(shù)百M(fèi)B甚至數(shù)GB的游戲的代碼都放在一個(gè)應(yīng)用程序里,日后的修改工作將會(huì)十分費(fèi)時(shí),而如果把不同功能的代碼分別放在數(shù)個(gè)動(dòng)態(tài)鏈接庫(kù)中,您無(wú)需重新生成或安裝整個(gè)程序就可以應(yīng)用更新。
動(dòng)態(tài)鏈接庫(kù):動(dòng)態(tài)鏈接庫(kù)文件,是一種不可執(zhí)行的二進(jìn)制程序文件,它允許程序共享執(zhí)行特殊任務(wù)所必需的代碼和其他資源。Windows 提供的DLL文件中包含了允許基于 Windows 的程序在 Windows 環(huán)境下操作的許多函數(shù)和資源。一般被存放在電腦的"C:\Windows\System32" 目錄下。Windows 中,DLL 多數(shù)情況下是帶有 ".dll"擴(kuò)展名的文件,但也可能是 ".ocx"或其他擴(kuò)展名;Linux系統(tǒng)中常常是 ".so" 的文件。它們向運(yùn)行于 Windows操作系統(tǒng)下的程序提供代碼、數(shù)據(jù)或函數(shù)。程序可根據(jù) DLL 文件中的指令打開(kāi)、啟用、查詢(xún)、禁用和關(guān)閉驅(qū)動(dòng)程序。背景:DLL的最初目的是節(jié)約應(yīng)用程序所需的磁盤(pán)和內(nèi)存空間。在一個(gè)傳統(tǒng)的非共享庫(kù)中,一部分代碼簡(jiǎn)單地附加到調(diào)用的程序上。如果兩個(gè)程序調(diào)用同一個(gè)子程序,就會(huì)出現(xiàn)兩份那段代碼。相反,許多應(yīng)用共享的代碼能夠切分到一個(gè)DLL中,在硬盤(pán)上存為一個(gè)文件,在內(nèi)存中使用一個(gè)實(shí)例(instance)。DLL的廣泛應(yīng)用使得早期的視窗能夠在緊張的內(nèi)存條件下運(yùn)行?! ?/p>
DLL提供了如模塊化這樣的共享庫(kù)的普通好處。模塊化允許僅僅更改幾個(gè)應(yīng)用程序共享使用的一個(gè)DLL中的代碼和數(shù)據(jù)而不需要更改應(yīng)用程序自身。這種模塊化的基本形式允許如Microsoft Office、Microsoft Visual Studio、甚至Microsoft Windows自身這樣大的應(yīng)用程序使用較為緊湊的補(bǔ)丁和服務(wù)包。模塊化的另外一個(gè)好處是插件的通用接口使用。單個(gè)的接口允許舊的模塊與新的模塊一樣能夠與以前的應(yīng)用程序運(yùn)行時(shí)無(wú)縫地集成到一起,而不需要對(duì)應(yīng)用程序本身作任何更改。這種動(dòng)態(tài)擴(kuò)展的思想在ActiveX中發(fā)揮到了極致。盡管有這么多的優(yōu)點(diǎn),使用DLL也有一個(gè)缺點(diǎn):DLL地獄,也就是幾個(gè)應(yīng)用程序在使用同一個(gè)共享DLL庫(kù)發(fā)生版本沖突。這樣的沖突可以通過(guò)將不同版本的問(wèn)題DLL放到應(yīng)用程序所在的文件夾而不是放到系統(tǒng)文件夾來(lái)解決;但是,這樣將抵消共享DLL節(jié)約的空間。目前,Microsoft .NET將解決DLL hell問(wèn)題當(dāng)作自己的目標(biāo),它允許同一個(gè)共享庫(kù)的不同版本并列共存。由于現(xiàn)代的計(jì)算機(jī)有足夠的磁盤(pán)空間和內(nèi)存,這也可以作為一個(gè)合理的實(shí)現(xiàn)方法。
DLL生成與使用(Clion、Visual Studio、QT Creator)DLL概述:它們是一些獨(dú)立的文件,其中包含能被可執(zhí)行程序或其他dll調(diào)用來(lái)完成某項(xiàng)工作的函數(shù),只有在其他模塊調(diào)用dll中的函數(shù)時(shí),dll才發(fā)揮作用。在實(shí)際編程中,我們可以把完成某項(xiàng)功能的函數(shù)放在一個(gè)動(dòng)態(tài)鏈接庫(kù)里,然后提供給其他程序調(diào)用。像Windows API中所有的函數(shù)都包含在dll中,如Kernel32.dll,User32.dll,GDI32.dll等。那么dll究竟有什么好處呢?靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù):靜態(tài)庫(kù),函數(shù)和數(shù)據(jù)被編譯進(jìn)一個(gè)二進(jìn)制文件(擴(kuò)展名通常為.lib)在使用靜態(tài)庫(kù)的情況下,在編譯鏈接可執(zhí)行文件時(shí),鏈接器從靜態(tài)庫(kù)中復(fù)制這些函數(shù)和數(shù)據(jù),并把它們和應(yīng)用程序的其他模塊組合起來(lái)創(chuàng)建最終的可執(zhí)行文件(.exe)。當(dāng)發(fā)布產(chǎn)品時(shí),只需要發(fā)布這個(gè)可執(zhí)行文件,并不需要發(fā)布被使用的靜態(tài)庫(kù)。動(dòng)態(tài)庫(kù):在使用動(dòng)態(tài)庫(kù)時(shí),往往提供兩個(gè)文件:一個(gè)引入庫(kù)(.lib,非必須)和一個(gè).dll文件。
這里的引入庫(kù)和靜態(tài)庫(kù)文件雖然擴(kuò)展名都是.lib,但是有著本質(zhì)上的區(qū)別,對(duì)于一個(gè)動(dòng)態(tài)鏈接庫(kù)來(lái)說(shuō),其引入庫(kù)文件包含該動(dòng)態(tài)庫(kù)導(dǎo)出的函數(shù)和變量的符號(hào)名,而.dll文件包含該動(dòng)態(tài)庫(kù)實(shí)際的函數(shù)和數(shù)據(jù)。使用動(dòng)態(tài)鏈接庫(kù)的好處可以使用多種編程語(yǔ)言編寫(xiě):比如我們可以用VC++編寫(xiě)dll,然后在VB編寫(xiě)的程序中調(diào)用它。增強(qiáng)產(chǎn)品功能:可以通過(guò)開(kāi)發(fā)新的dll取代產(chǎn)品原有的dll,達(dá)到增強(qiáng)產(chǎn)品性能的目的。比如我們看到很多產(chǎn)品踢動(dòng)了界面插件功能,允許用戶動(dòng)態(tài)地更換程序的界面,這就可以通過(guò)更換界面dll來(lái)實(shí)現(xiàn)。提供二次開(kāi)發(fā)的平臺(tái):用戶可以單獨(dú)利用dll調(diào)用其中實(shí)現(xiàn)的功能,來(lái)完成其他應(yīng)用,實(shí)現(xiàn)二次開(kāi)發(fā)。節(jié)省內(nèi)存:如果多個(gè)應(yīng)用程序使用同一個(gè)dll,該dll的頁(yè)面只需要存入內(nèi)存一次,所有的應(yīng)用程序都可以共享它的頁(yè)面,從而節(jié)省內(nèi)存。Clion+msvc生成的dll可以在使用同一編譯器的不同sdk之間相互調(diào)用,但是要注意導(dǎo)出的是x86還是amd64。生成DLL:新建項(xiàng)目,C++庫(kù):類(lèi)型選擇shared即可。
