靜態鏈結和動態鏈結

2021-08-21 04:03:28 字數 1385 閱讀 7538



1、靜態鏈結庫只包含:lib檔案;動態鏈結庫包含:lib檔案和dll檔案,靜態鏈結庫中不能再包含其他的動態鏈結庫或者靜態庫,而在動態鏈結庫中還可以再包含其他的動態或靜態鏈結庫。此外他們都會用到定義了函式和相關資料結構的.h標頭檔案,其中:.h標頭檔案是編譯時必須的,lib是鏈結時需要的,dll是執行時需要的。

2.靜態鏈結庫的lib是靜態編譯出來的(obj檔案的集合。類似於linux中.a檔案是.o檔案的集合),包含函式**本身(索引和實現都在其中),在編譯時直接將**加入exe程式當中,稱為靜態鏈結庫static link library;

動態鏈結庫的lib包含了函式所在的dll檔案和檔案中函式位置的資訊/入口(一般是一些索引資訊,記錄了dll中函式的入口和位置),函式**由執行時載入在程序空間中的dll提供(dll中才是函式的具體內容),稱為動態鏈結庫dynamic link library。

3、如何生成lib檔案和dll檔案比較簡單,省略。

(1)靜態鏈結(隱式鏈結)使用靜態鏈結庫或者動態鏈結庫:使用靜態鏈結庫時鏈結器從靜態鏈結庫lib獲取所有被引用函式,並將庫同**一起放到可執行檔案中;使用動態鏈結庫時鏈結器使用lib檔案鏈結到dll檔案,執行時應用程式再將dll中的**載入到程序空間。

動態鏈結(顯式鏈結)使用動態鏈結庫,允許可執行模組(.dll檔案或.exe檔案)僅包含在執行時定位dll函式的可執行**所需的資訊。

如下**:

typedef

void

(*dllfunc)

(int)

;

intmain

()

dllfunc = (dllfunc)getprocaddress(hinstdll,

"testdll"

); //testdll為想呼叫的dll中的函式

if(dllfunc ==

null

)

dllfunc(

123);

freelibrary(hinstdll);

return

0;

}

總結上述內容可以看出各有優劣:

(1)使用lib靜態鏈結庫,在執行程式時不需要再掛載dll檔案,缺點是導致應用程式比較大,而且失去了動態庫的靈活性,發布新版本時要發布新的應用程式才行。

(2)使用lib和dll動態鏈結庫,在應用程式的可執行檔案中,存放的不是被呼叫的函式**,而是dll中相應函式**的位址,使得應用程式比較小,從而節省了儲存資源,但是要額外的記憶體空間用於載入dll中的內容。

【參考1:c++:lib和dll的區別與使用_資料庫/開發_位元網

】【參考2:靜態鏈結庫lib和動態鏈結庫dll的區別 建立和示例- 飛天舞者 -

靜態鏈結和動態鏈結

靜態載入dll dll工程b 專案屬性 配置屬性 常規 配置型別 動態庫 dll 在宣告檔案中,宣告匯出函式 declspec dllexport int xx 如果是c檔案,要在c 檔案中被呼叫,註明extern c 可以 ifdef cplusplus extern c endif 呼叫dll的...

靜態鏈結和動態鏈結

動態鏈結庫 靜態庫 import庫區別 windows為應用程式提供了豐富的函式呼叫,這些函式呼叫都包含在動態鏈結庫中。其中有3個最重要的dll,kernel32.dll,它包含用於管理記憶體 程序和執行緒的各個函式 user32.dll,它包含用於執行使用者介面任務 如視窗的建立和訊息的傳送 的各...

靜態鏈結和動態鏈結

靜態鏈結 由於在我們實際的開發中,不可能將他們都放在乙個檔案中執行,所以將他們生成.o檔案進行,從而要將他們進行鏈結,從而實現乙個可以執行的程式,這個過程就是靜態鏈結 靜態庫 是由多個多個.o檔案壓縮打包形成的乙個檔案 靜態鏈結的優點 他在執行的時候都已經將副本都放入了檔案中,所以執行的速度變快 缺...