動態鏈結庫小結

2021-06-29 15:46:07 字數 1758 閱讀 6939

、鏈結庫概述

使用動態鏈結庫可以實現軟體設計的模組化,動態鏈結庫是在執行時才進行連線並能夠共享的函式庫,可以將不同功能的模組封裝到不同的鏈結庫中,功能相同或相似的模組封裝到相同的鏈結庫中。鏈結庫是乙個以二進位制方式儲存資料的磁碟檔案,它本身不能執行,需要其他的應用程式執行時載入或編譯前進行引用。dll就是完成一定功能的模組,既可以包含資料、函式,也可以包含類。dll中包含兩種物件:

1)匯出物件:如匯出資料、匯出函式和匯出類,此種物件可以被其他可執行模組呼叫。雖然dll可以匯出資料,但是通常dll中的資料都是內部資料,僅供內部函式使用,不建議從dll中匯出資料。

2)內部物件:如內部資料、內部函式和內部類,此種物件只能在dll內部由內部使用。

dll動態鏈結庫和exe可執行檔案類似,都是可執行程式模組,但是也存在很多不同之處。對於使用者來說,最大的差別在於dll不是可以直接執行的程式。從系統的角度來看,他們之間存在兩個基本的區別。一是應用程式可以在系統中同步執行多個例項,而dll只能有乙個例項。而是應用程式可以管理諸如堆疊、全域性記憶體、檔案控制代碼和訊息佇列等資源,而dll不能管理這些資源。

鏈結庫可以分為靜態鏈結庫和動態鏈結庫兩種。

1)靜態鏈結庫:它經常是一些相對小的,比較穩定的函式庫,例如stdlib.lib。靜態鏈結庫通常是幾組與應用程式相鏈結的可重用的函式,靜態鏈結庫是應用程式的一部分,如果靜態鏈結庫中的內容更新了,那麼應用程式就要和新的靜態鏈結庫重新鏈結。

2)動態鏈結庫:其可以在需要的時候動態載入到記憶體中,而且動態鏈結庫在記憶體中只有乙個例項,如果乙個應用程式呼叫了dll,其他應用程式也呼叫了該dll,那麼第2個程式只是將dll在記憶體中的位址對映到自己的程序位址空間中;系統有乙個計數器,記錄有多少個應用程式在使用dll。如果計數器為0,則將dll從記憶體中解除安裝。在16為windows系統中dll是被載入到共享位址空間的,而在windows200下,dll被對映到應用程式自己的程序位址空間。

靜態鏈結庫和動態鏈結庫的乙個主要區別在於靜態鏈結庫中不能再包含其他的動態鏈結庫和靜態鏈結庫,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫。

2、動態鏈結庫的建立及呼叫

1)建立動態鏈結庫

至此,所需要的庫檔案便編譯好了。在工程目錄下的debug目錄下生成了兩個檔案.lib和.dll,其中.lib是匯出函式源**的實現,而.dll就是需要的動態鏈結庫檔案。

2)靜態鏈結庫的呼叫及動態鏈結庫的隱式呼叫

#include "***.h"     //包含鏈結庫的標頭檔案

#pragma comment(lib, "***")  //隱式呼叫庫檔案.lib

上述**就是隱式鏈結的方法。其中語句#pragma comment(lib,"***")可以通過工程設定對話方塊來設定代替。

至此,執行***.exe檔案即可看到程式的執行結果。對上述源**進行分析可以看出,在該動態庫中匯出的是函式而不是類。對於函式的匯出,也可以用顯式呼叫方式。

3)動態鏈結庫的顯式呼叫

顯式呼叫的動態載入主要是通過loadlibrary和getprocaddress兩個函式來實現的。

hinstance loadlibrary(lpctstr lplibfilename);

getprocaddress(hmodule hmodule, lpcstr lpprocname)

其中:hmodule是載入到記憶體中的模組的控制代碼,主要指loadlibrary的返回值。

lpporcname是函式的名稱

在顯式呼叫中,首先要定義乙個指向匯出函式的函式指標,然後呼叫loadlibrary和getprocaddress,獲得函式指標,即可像使用本地函式一樣使用匯出函式。在此不再贅述。

動態鏈結庫小結

lib 靜態庫 x.dll x.lib 分別是動態庫動態庫的引入庫 1 拷入動態庫dll 引入庫lib 2 加入標頭檔案 3 alt f7 link選項卡 object library modules 中輸入引入庫如 lib 第3步也可以用這句 代替 pragma comment lib,mydll...

動態鏈結庫 靜態鏈結庫

包含標頭檔案和庫 idir 指定編譯查詢標頭檔案的目錄,常用於查詢第三方的庫的標頭檔案,例 gcc test.c i.inc o test。ldir 指定鏈結時查詢lib的目錄,常用於查詢第三方庫。llibrary 指定額外鏈結的lib庫 巨集定義 dmacro 以字串 1 預設值 定義 macro...

靜態鏈結庫 動態鏈結庫

庫是寫好的現有的,成熟的,可以復用的 現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的 都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行 的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種 靜態庫 a lib 和動態庫 so dll windows上對應的是.lib dll ...