首先,想要知道動態(tài)庫,我們得了解C++/C以及計算機的一些背景知識。

專注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站設(shè)計服務(wù),電腦端+手機端+微信端的三站合一,更高效的管理,為中小企業(yè)金湖免費做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動了上千企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實現(xiàn)規(guī)模擴充和轉(zhuǎn)變。
一般而言,在Windows下,*.dll文件就是動態(tài)庫文件。用C++/C開發(fā)的程序,在發(fā)布的時候,會出現(xiàn)兩種情況,第一,整個軟件就只有一個文件,你只要雙擊那個exe文件,就可以運行。第二,除了exe之外,還有dll等文件。在這里,我們假設(shè)的文件只有exe文件和dll文件, 不討論什么圖標(biāo)之類文件。
只有一個文件的,庫已經(jīng)嵌到那個exe里面。而有很多dll文件的程序,庫沒有嵌入到exe里面。所以,你可以看一下,如果那個exe文件大小非常大,那就說明是靜態(tài)鏈接,在開發(fā)的時候是使用靜態(tài)庫。如果那個exe非常小,那么一般是使用的動態(tài)庫。
那么問題來了,動態(tài)庫與靜態(tài)庫相比優(yōu)勢又是什么。動態(tài)庫節(jié)約內(nèi)存,為什么這么說呢。假如兩個類型的程序,如果他們都有一個共同使用的dll,那么在內(nèi)存里面,只有一份,而不是兩份。如果是使用了靜態(tài)庫,這會有兩份,會有很大的浪費空間。
當(dāng)然,使用動態(tài)庫還有需要注意的地方。比如,有兩個名字一模一樣的動態(tài)庫Qtcore4.dll,但是呢,一個dll是用vs2010編譯器生成的,一個是用vs2015編譯器生成的。如果,exe使用的dll弄錯的話,程序結(jié)果會不對或者其他奇葩的問題。
以上均是一個大致的講解,細節(jié)部分請參考程序員的自我修養(yǎng)這本書!
靜態(tài)庫和動態(tài)庫的使用包括兩個方面
1是使用已有的庫(調(diào)用過程)
2是編寫一個庫供別人使用(創(chuàng)建過程)。這里不講述過多的原理,只說明如何編寫,以及不正確編寫時會遇見的問題。
//注:本文先從簡單到復(fù)雜,動態(tài)庫的部分先說明了靜態(tài)鏈接方式,比較簡單,若想看動態(tài)鏈接過程會遇到的問題可直接跳過。
一、動態(tài)鏈接庫的概念 動態(tài)鏈接庫(Dynamic Link Library,縮寫為DLL)是一個可以被其它應(yīng)用程序共享的程序模塊,其中封裝了一些可以被共享的例程和資源。動態(tài)鏈接庫文件的擴展名一般是dll,也有可能是drv、sys和fon,它和可執(zhí)行文件(exe)非常類似,區(qū)別在于DLL中雖然包含了可執(zhí)行代碼卻不能單獨執(zhí)行,而應(yīng)由Windows應(yīng)用程序直接或間接調(diào)用。 動態(tài)鏈接是相對于靜態(tài)鏈接而言的。所謂靜態(tài)鏈接是指把要調(diào)用的函數(shù)或者過程鏈接到可執(zhí)行文件中,成為可執(zhí)行文件的一部分。換句話說,函數(shù)和過程的代碼就在程序的exe文件中,該文件包含了運行時所需的全部代碼。當(dāng)多個程序都調(diào)用相同函數(shù)時,內(nèi)存中就會存在這個函數(shù)的多個拷貝,這樣就浪費了寶貴的內(nèi)存資源。而動態(tài)鏈接所調(diào)用的函數(shù)代碼并沒有被拷貝到應(yīng)用程序的可執(zhí)行文件中去,而是僅僅在其中加入了所調(diào)用函數(shù)的描述信息(往往是一些重定位信息)。僅當(dāng)應(yīng)用程序被裝入內(nèi)存開始運行時,在Windows的管理下,才在應(yīng)用程序與相應(yīng)的DLL之間建立鏈接關(guān)系。當(dāng)要執(zhí)行所調(diào)用DLL中的函數(shù)時,根據(jù)鏈接產(chǎn)生的重定位信息,Windows才轉(zhuǎn)去執(zhí)行DLL中相應(yīng)的函數(shù)代碼。 一般情況下,如果一個應(yīng)用程序使用了動態(tài)鏈接庫,Win32系統(tǒng)保證內(nèi)存中只有DLL的一份復(fù)制品,這是通過內(nèi)存映射文件實現(xiàn)的。DLL首先被調(diào)入Win32系統(tǒng)的全局堆棧,然后映射到調(diào)用這個DLL的進程地址空間。在Win32系統(tǒng)中,每個進程擁有自己的32位線性地址空間,如果一個DLL被多個進程調(diào)用,每個進程都會收到該DLL的一份映像。與16位Windows不同,在Win32中DLL可以看作是每個進程自己的代碼。 二、動態(tài)鏈接庫的優(yōu)點 1. 共享代碼、資源和數(shù)據(jù) 使用DLL的主要目的就是為了共享代碼,DLL的代碼可以被所有的Windows應(yīng)用程序共享。 2. 隱藏實現(xiàn)的細節(jié) DLL中的例程可以被應(yīng)用程序訪問,而應(yīng)用程序并不知道這些例程的細節(jié)。 3. 拓展開發(fā)工具如Delphi的功能 由于DLL是與語言無關(guān)的,因此可以創(chuàng)建一個DLL,被C++、VB或任何支持動態(tài)鏈接庫的語言調(diào)用。這樣如果一種語言存在不足,就可以通過訪問另一種語言創(chuàng)建的DLL來彌補。 三、動態(tài)鏈接庫的實現(xiàn)方法 1. Load-time Dynamic Linking 這種用法的前提是在編譯之前已經(jīng)明確知道要調(diào)用DLL中的哪幾個函數(shù),編譯時在目標(biāo)文件中只保留必要的鏈接信息,而不含DLL函數(shù)的代碼;當(dāng)程序執(zhí)行時,利用鏈接信息加載DLL函數(shù)代碼并在內(nèi)存中將其鏈接入調(diào)用程序的執(zhí)行空間中,其主要目的是便于代碼共享。 2. Run-time Dynamic Linking 這種方式是指在編譯之前并不知道將會調(diào)用哪些DLL函數(shù),完全是在運行過程中根據(jù)需要決定應(yīng)調(diào)用哪個函數(shù),并用LoadLibrary和GetProcAddress動態(tài)獲得DLL函數(shù)的入口地址。 代碼如下: 在Microsoft Visual Studio .NET 2003中創(chuàng)建動態(tài)鏈接庫的步驟如下: 1.新建項目 2.Win32 控制臺項目 3.應(yīng)用程序設(shè)置 4.選擇DLL項 完成,直接在后面添加代碼即可: extern "C" _declspec(dllexport) int sum(int x,int y) { return x+y; } 代碼編輯完成后,選擇“生成”菜單中的“生成mydll”,即可生成動態(tài)連接庫文件。 下面是測試動態(tài)連接庫的代碼: #include #include int main(void) { typedef int (*pf)(int,int); pf add; HINSTANCE his; if((his=LoadLibrary("mydll"))==NULL) { printf("load dll error\n"); return -1; } if((add=(pf)GetProcAddress(his,"add"))==NULL) { printf("load function error\n"); return -1; } printf("%d\n",add(10,20)); FreeLibrary(his); return 0; }
動態(tài)庫又稱動態(tài)鏈接庫英文為DLL,是Dynamic Link Library 的縮寫形式,DLL是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,DLL不是可執(zhí)行文件。動態(tài)鏈接提供了一種方法,使進程可以調(diào)用不屬于其可執(zhí)行代碼的函數(shù)。函數(shù)的可執(zhí)行代碼位于一個 DLL 中,該 DLL 包含一個或多個已被編譯、鏈接并與使用它們的進程分開存儲的函數(shù)。DLL 還有助于共享數(shù)據(jù)和資源。多個應(yīng)用程序可同時訪問內(nèi)存中單個DLL 副本的內(nèi)容。DLL 是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫。Windows下動態(tài)庫為.dll后綴,在linux在為.so后綴。
當(dāng)前文章:包含windows系統(tǒng)動態(tài)庫的詞條
路徑分享:http://chinadenli.net/article43/dsgejhs.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站、小程序開發(fā)、外貿(mào)建站、靜態(tài)網(wǎng)站、全網(wǎng)營銷推廣、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)