動態鏈接
出自 MBA智库百科(https://wiki.mbalib.com/)
動態鏈接(Dynamic Linking)
目錄 |
什麼是動態鏈接[1]
動態鏈接是指編譯系統在鏈接階段並不把目標文件和函數庫文件鏈接在一起,而是等到程式在運行過程中需要使用時才鏈接函數庫。
動態鏈接的優缺點[2]
一、動態鏈接的優點是:
1、共用:多個進程可以共用一個DLL,比較節省記憶體,從而可以減少文件的交換。
2、部分裝入:一個進程可以將多種操作分散在不同的DLL中實現,而只將當前操作的DLL裝入記憶體。
3、便於局部代碼修改:即便於代碼升級和代碼重用;只要函數的介面參數(輸入和輸出)不變,則修改函數及其DLL時,無需對可執行文件重新編譯或鏈接。
4、便於適應運行環境:調用不同的DLL,就可以適應多種使用環境並提供不同的功能。例如:不同的顯示卡只需廠商為其提供特定的DLL,而操作系統和應用程式則不必修改。
二、動態鏈接的缺點是:
1、增加了程式執行時的鏈接開銷。
2、程式由多個文件組成,因此增加了管理複雜度。
動態鏈接與靜態鏈接[3]
源程式在經過編譯生成目標代碼後需要進行鏈接才能生成可執行文件。鏈接分為兩種,一種是靜態鏈接,另一種是動態鏈接。動態鏈接發生在程式運行時,動態鏈接的函數代碼不出現在程式的EXE文件中;而靜態鏈接發生在編譯時,靜態鏈接的函數代碼實際被插入到程式的EXE文件中。用於靜態鏈接的函數通常保存在OBJ和IJB文件中。例如,編寫一個由一些獨立的編譯單元(文件)組成的大型程式時,鏈接器在創建EXE文件時將每個模塊MOBJ文件結合起來,此時EXE文件將包含OBJ文件中的所有代碼。
使用動態鏈接時,用於動態鏈接的函數代碼保存在與程式的其他部分相獨立的DEF文件中。讀者將會看到,用戶的程式要包含鏈接DLL函數載入指令的少量代碼,但並不將函數本身包括進來。