Visual C 之 動態鏈結庫

2021-07-23 09:27:48 字數 1610 閱讀 6779

動態鏈結庫是基於提高系統記憶體資源的使用效率的解決辦法。

為提高記憶體資源的使用效率,每乙個程式都應該盡量少占用記憶體空間,在多工環境下,同時執行的多個應用程式有時要呼叫相同的函式(尤其是一些統一的介面),比如標準的數學函式和windows環境下的視窗維護函式等等。因此,設想當多個應用程式同時執行並且都呼叫同乙個函式時,不應該在記憶體上生成這個函式的多份拷貝,而應該使這些程式能夠共享這個函式在記憶體中的執行**,這樣就減少了程式對記憶體的占用。動態連線庫就是這樣的具體實現辦法。

1. dll 介紹

動態鏈結庫(dynamic link library, dll)是乙個包含了若干個匯出函式的可執行檔案。與靜態連線庫(sll)類似,dll本質上也是乙個函式庫。但是與前者的主要區別是庫**的鏈結時機。如名字所理解,sll是在編譯、鏈結程式時就同程式鏈結,dll則是在程式執行時才同程式鏈結;前者通過鏈結器link完成,後者由windows作業系統(程式的執行者/管理者/載體)完成。

此外,sll是直接把庫裡面的可執行**直接複製到應用程式中,這樣就增加了程式最終的可執行**長度。sll在多工環境下執行效率可能很低,比如,兩個程式同時執行且呼叫了庫內的同乙個函式,那麼記憶體中就存在該函式的兩個副本,從而降低了記憶體的使用效率。

dll並不是這樣,它不複製**到程式中,而是通過動態載入,dll**被映像到呼叫程序的位址空間。dll允許多個程式共享某個函式的乙個副本。無論被多少個程式呼叫,在記憶體中只允許該函式的乙個副本。

2. dll 功能

除了實現**的共享,還能實現資源的共享。dll具有模組封裝特性,只要匯出的函式名相同,程式執行同乙個dll的不同版本不需要編譯和鏈結。所以這使得產品在公升級或更新時,客戶程式無需進行修改。

3. 建立dll

參考文章: 

//比如在建立的動態鏈結庫mymfcdll的原始檔mymfcdll.cpp中定義乙個匯出函式

_declspec(dllexport) char * winapi getdateandtime()

// 在標頭檔案mymfcdll.h中新增匯出函式宣告,必須使用匯出關鍵字_declspec(dllexport)

// 匯出函式getdateandtime()的宣告

_declspec(dllexport) char * winapi getdateandtime();

對動態連線庫專案mymfcdll進行編譯、鏈結就生成了動態鏈結庫mymfcdll.dll和導入庫檔案mymfcdll.lib。將這個dll檔案複製到windows的system子目錄下,lib檔案複製到要呼叫這個dll的應用程式的debug目錄下,程式就能自動呼叫mymfcdll.dll的匯出函式getdateandtime()並正確編譯、鏈結、執行【隱式鏈結】。

4. 使用dll

分為隱式鏈結和顯式鏈結。

使用示例:

依照上例,比如在應用程式的cmainframe類中呼叫匯出函式getdateandtime()

void cmainframe::ondateandtime()

extern char * winapi getdateandtime();

class mainframe::public cframewnd

}參考文章: 

動態鏈結庫 靜態鏈結庫

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

靜態鏈結庫 動態鏈結庫

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

靜態鏈結庫,動態鏈結庫

關於靜態鏈結庫,參考如下博文 當你完成了 開發,想把這個 給別人用,但是又不希望別人看到原始碼,就要給別人乙個庫和標頭檔案,庫和標頭檔案是配合的,缺一不可。或者過程相反,你從別人那裡拿到乙個庫和標頭檔案來使用。那麼如何編譯生成乙個庫給他人,如何使用從他人那裡拿到的庫呢?範例1 我們想把linuxfr...