静态链接与动态链接
靜態(tài)鏈接是指把要調(diào)用的函數(shù)或者過程直接鏈接到可執(zhí)行文件中,成為可執(zhí)行文件的一部分。也就是函數(shù)和過程的代碼就在程序的可執(zhí)行文件中,可執(zhí)行文件包含了運(yùn)行時(shí)所需的全部代碼。 動(dòng)態(tài)鏈接是指所調(diào)用的函數(shù)代碼并沒有被拷貝到應(yīng)用程序的可執(zhí)行文件中去,而是僅僅在其中加入了所調(diào)用函數(shù)的描述信息,往往是一些重定位信息。僅當(dāng)應(yīng)用程序被裝入內(nèi)存開始運(yùn)行時(shí),在操作系統(tǒng)的管理下,應(yīng)用程序與相應(yīng)的動(dòng)態(tài)鏈接庫(kù)(dynamic link library,dll)之間建立鏈接關(guān)系,當(dāng)要執(zhí)行所調(diào)用dll中的函數(shù)時(shí),根據(jù)鏈接產(chǎn)生的重定位信息,操作系統(tǒng)才轉(zhuǎn)去執(zhí)行dll中相應(yīng)的函數(shù)代碼。 靜態(tài)鏈接的優(yōu)點(diǎn)是執(zhí)行程序能夠在其他同類操作系統(tǒng)的機(jī)器上直接運(yùn)行。缺點(diǎn)是當(dāng)多個(gè)程序都調(diào)用相同函數(shù)時(shí),內(nèi)存中就會(huì)存在這個(gè)函數(shù)的多個(gè)拷貝,這樣就浪費(fèi)了內(nèi)存資源。動(dòng)態(tài)鏈接的執(zhí)行程序則不能夠在其他同類操作系統(tǒng)的機(jī)器上直接運(yùn)行,除非把該exe文件所需的dll文件都一起拷貝過去,或者對(duì)方機(jī)器上也有所需的相同版本的dll文件,否則是不能保證正常運(yùn)行的。 靜態(tài)鏈接庫(kù)就是使用的.lib文件,庫(kù)中的代碼最后需要鏈接到可執(zhí)行文件中去,所以靜態(tài)鏈接的可執(zhí)行文件一般比較大一些。 動(dòng)態(tài)鏈接庫(kù)是一個(gè)包含可由多個(gè)程序同時(shí)使用的代碼和數(shù)據(jù)的庫(kù)。可執(zhí)行程序(如.exe文件或.dll文件)在運(yùn)行時(shí)加載動(dòng)態(tài)鏈接庫(kù),即將程序所需的動(dòng)態(tài)鏈接庫(kù)映射到調(diào)用進(jìn)程的地址空間。 靜態(tài)鏈接庫(kù)和動(dòng)態(tài)鏈接庫(kù)的相同點(diǎn)是它們都實(shí)現(xiàn)了代碼的共享。不同點(diǎn)是靜態(tài)鏈接庫(kù)lib中的代碼被包含在調(diào)用的exe文件中,該lib中不能再包含其他動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)鏈接庫(kù)了。動(dòng)態(tài)鏈接庫(kù)dll可以被調(diào)用的exe動(dòng)態(tài)地“引用”和“卸載”,該dll中可以包含其他動(dòng)態(tài)鏈接庫(kù)或者靜態(tài)鏈接庫(kù)。
轉(zhuǎn)載于:https://www.cnblogs.com/xidian2014/p/8615718.html
總結(jié)
- 上一篇: iOS开发UI篇—Quartz2D使用(
- 下一篇: maxN - 返回数组中N个最大元素 m