-
靜態(tài)鏈接與動態(tài)鏈接的區(qū)別:
靜態(tài)鏈接:把要調(diào)用的函數(shù)或者過程直接鏈接到可執(zhí)行文件中彤侍,成為可執(zhí)行文件的一部分,換句話說:函數(shù)和過程的代碼就在程序的EXE文件中晒奕,該文件包含運行時所需的全部代碼名斟,但存在當(dāng)多個程序調(diào)用相同的函數(shù)時,內(nèi)存中會存在多個該函數(shù)的拷貝闷袒,浪費內(nèi)存資源岩梳。
動態(tài)鏈接:動態(tài)鏈接是相對于靜態(tài)連接而言的,動態(tài)鏈接所調(diào)用的函數(shù)代碼并沒有被拷貝到應(yīng)用程序的可執(zhí)行文件中去也物,而是僅僅在其中加入了所調(diào)用函數(shù)的描述信息(往往是一些重定位信息)列疗,當(dāng)且僅當(dāng)程序被裝入內(nèi)存開始運行時,在操作系統(tǒng)的管理下告材,才在應(yīng)用程序與相應(yīng)的動態(tài)鏈接庫(DLL)之間建立聯(lián)系竭讳。當(dāng)要執(zhí)行所調(diào)用DLL中的函數(shù)時,根具鏈接產(chǎn)生的重定位信息灿渴,操作系統(tǒng)才會轉(zhuǎn)去執(zhí)行DLL中的相應(yīng)代碼胰舆。
-
靜態(tài)鏈接庫與動態(tài)鏈接庫的區(qū)別:
靜態(tài)鏈接庫就是使用的.lib文件缚窿,庫中的代碼最后需要鏈接到可執(zhí)行文件中去,所以靜態(tài)鏈接的可執(zhí)行文件一般比較大一些倦零。動態(tài)鏈接庫是一個包含可由多個程序同時使用的代碼和數(shù)據(jù)的庫,它包含函數(shù)和數(shù)據(jù)模塊的集合蹋嵌,程序文件(如.exe文件和.dll文件)在運行時加載這些模塊(也即所需的模塊映射到調(diào)用進(jìn)程的內(nèi)存地址空間)。
靜態(tài)連接庫和動態(tài)鏈接庫的相同點是他們都實現(xiàn)了代碼共享躏仇。不同點是靜態(tài)連接庫lib中的代碼被包含在調(diào)用的exe文件中腺办,該lib文件不能再包含其他動態(tài)鏈接庫或者靜態(tài)連接庫,而動態(tài)鏈接庫dll可以被調(diào)用的exe動態(tài)的“引用”和“卸載”怀喉,該dll中可以包含其他的靜態(tài)連接庫或動態(tài)鏈接庫。