天天看點

動态加載和靜态加載(動态庫和靜态庫)

一、靜态庫

與彙編生成的目标檔案一起連結為可執行檔案。一個靜态庫可以簡單看成是一組目标檔案(.o/.obj檔案)的集合,即很多目标檔案經過壓縮打包後形成的一個檔案。靜态連結庫,以.a 為檔案字尾名(PC下是.lib)。特點如下:

  • 靜态庫對函數庫的連結是放在編譯時期完成的。
  • 程式在運作時與函數庫再無瓜葛,移植友善。
  • 浪費空間和資源,因為所有相關的目标檔案與牽涉到的函數庫被連結合成一個可執行檔案。

二、動态庫

在程式編譯時并不會被連接配接到目标代碼中,而是在程式運作是才被載入。不同的應用程式如果調用相同的庫,那麼在記憶體裡隻需要有一份該共享庫的執行個體,規避了空間浪費問題。動态庫在程式運作時才被載入,也解決了靜态庫對程式的更新、部署和釋出頁會帶來麻煩。使用者隻需要更新動态庫即可,增量更新。動态連結庫,以.tbd(之前叫.dylib) 為檔案字尾名(linux下是.so,PC下是.dll)。特點如下:

  • 動态庫把對一些庫函數的連結載入推遲到程式運作的時期。 
  • 可以實作程序之間的資源共享。(是以動态庫也稱為共享庫)
  • 将一些程式更新變得簡單。
  • 甚至可以真正做到連結載入完全由程式員在程式代碼中控制(顯示調用)。 

三、兩者差別

  • 靜态庫在程式編譯時會被連結到目标代碼中,程式運作時将不再需要該靜态庫。而動态庫在程式編譯時并不會被連結到目标代碼中,而是在程式運作時才被載入,是以在程式運作時還需要動态庫存在。
  • 靜态庫代碼裝載速度快,執行速度略比動态庫快。
  • 動态庫更加節省記憶體,可執行檔案體積比靜态庫小很多。