靜態(tài)照片做成動態(tài)視頻軟件 linux動態(tài)庫和靜態(tài)庫的區(qū)別?
linux動態(tài)庫和靜態(tài)庫的區(qū)別?通常編譯動態(tài)鏈接庫和靜態(tài)鏈接庫來集成一系列接口(函數(shù))程序源代碼編譯后,它是由編譯器編譯并通過鏈接器鏈接到這些庫中的動態(tài)鏈接庫和靜態(tài)鏈接庫的區(qū)別是鏈接器鏈接時靜態(tài)鏈接庫
linux動態(tài)庫和靜態(tài)庫的區(qū)別?
通常編譯動態(tài)鏈接庫和靜態(tài)鏈接庫來集成一系列接口(函數(shù))
程序源代碼編譯后,它是由編譯器編譯并通過鏈接器鏈接到這些庫中的
動態(tài)鏈接庫和靜態(tài)鏈接庫的區(qū)別是鏈接器鏈接時靜態(tài)鏈接庫會直接編譯到程序中
但是動態(tài)鏈接庫不會被編譯,這些鏈接庫稱為依賴關(guān)系(動態(tài)庫和靜態(tài)庫)
程序的運(yùn)行需要這些依賴關(guān)系。程序靜態(tài)鏈接后,程序本身已包含此依賴項(xiàng)
但動態(tài)鏈接的程序本身不包含此依賴項(xiàng)。這些依賴項(xiàng)需要執(zhí)行器將它們安裝到操作系統(tǒng)中(動態(tài)庫和運(yùn)行時庫)
這些庫將在程序運(yùn)行時動態(tài)加載
Linux動態(tài)庫的一般后綴為。所以
靜態(tài)庫的一般后綴是。A
因?yàn)殪o態(tài)鏈接會直接將庫編譯到程序中,靜態(tài)編譯的程序比動態(tài)鏈接的程序大
這是因?yàn)殪o態(tài)鏈接會將鏈接庫編譯到程序中,所以占用的空間會更大
因此,如果有靜態(tài)鏈接庫,靜態(tài)庫不易維護(hù)和更新實(shí)現(xiàn)中的bug,整個程序需要更新,因?yàn)殪o態(tài)庫被編譯到程序中
而動態(tài)庫沒有這種情況,因?yàn)閯討B(tài)庫是在程序運(yùn)行時動態(tài)加載的,所以我們只需要更新動態(tài)庫,而不需要更新所有依賴該庫的程序(軟件)
]另一方面,許多程序開發(fā)都會使用相同的方法鏈接庫,也就是說,許多程序(軟件)將具有相同的依賴關(guān)系
如果所有這些依賴關(guān)系都是靜態(tài)編譯的,它會造成存儲資源的過度消耗和資源的浪費(fèi)
通過使用動態(tài)庫,這些程序(軟件)可以共享一個鏈接庫,而每個程序都沒有鏈接庫,這大大減少了存儲資源的消耗空間
我們可以得出第一個結(jié)論:兩者都是靜態(tài)鏈接庫。當(dāng)有同名函數(shù)時,鏈接會有多次定義符號的錯誤!讓我們看看這兩個動態(tài)庫。同一個LIBA libb生成動態(tài)鏈接庫,不修改主測試程序!或者:這種編譯方法稱為動態(tài)庫的隱式調(diào)用。如果你刪除一個利巴索,運(yùn)行a.out時,將出現(xiàn)找不到動態(tài)庫的錯誤。這種情況也可以稱為加載時間鏈接!靜態(tài)庫屬于編譯時鏈接!第二個結(jié)論是:如果它們都是動態(tài)庫并且被隱式調(diào)用,則輸出結(jié)果與動態(tài)庫的順序有關(guān)。繼續(xù)看動態(tài)加載動態(tài)庫。修改主測試程序還可以得出結(jié)論,如果動態(tài)鏈接庫沒有add library link選項(xiàng),則函數(shù)調(diào)用是正確的add library路徑,這將基于庫的路徑順序!左側(cè)將覆蓋右側(cè)。當(dāng)只有一個鏈接被鏈接時,它也會生效。例如圖片已經(jīng)非法,請?jiān)儐?,謝謝
靜態(tài)庫是通過加載編譯的源代碼,如各種頭文件。
動態(tài)庫被映射到程序的內(nèi)存空間,以便在程序運(yùn)行時進(jìn)行動態(tài)加載,例如DLL文件。