動態庫和靜態庫的特性

001.jpg
大師兄鎮樓。O(∩_∩)O哈哈~
什麼是庫
庫是共享程式程式碼的方式,一般分為靜態庫(static libraries)、動態庫(dynamically loaded libraries)和共享庫(shared libraries)。
靜態庫
靜態函式庫實際上就是簡單的一個普通的目標檔案的集合,一般來說習慣用“.a”作為檔案的字尾。
靜態函式庫,是在程式執行前就加入到目標程式中去了 。
靜態庫的字尾是.a,它的產生分兩步(linux下)
- 由原始檔編譯生成一堆.o,每個.o裡都包含這個編譯單元的符號表
- ar命令將很多.o轉換成.a,成文靜態庫
Android中需要設定Android.mk檔案。
動態庫
動態庫是在當一個可執行程式在啟動的時候被載入。
在linux上叫共享物件庫, 檔案字尾是.so ,windows上叫動態載入函式庫, 檔案字尾是.dll。
每個動態庫都有個特殊的名字,稱作“soname”。soname名字命名必須以“lib”作為字首,然後是函式庫的名字,然後是“.so”,最後是版本號資訊。
動態庫庫檔案必須放在一些特定的目錄裡,這樣通過系統的環境變數設定,應用程式才能正確的使用這些函式庫。
優缺點
靜態庫的優點
(1) 程式碼裝載速度快,執行速度略比動態連結庫快;
(2) 只需保證在開發者的計算機中有正確的.LIB檔案,在以二進位制形式釋出程式時不需考慮在使用者的計算機上.LIB檔案是否存在及版本問題,可避免so地獄等問題。
動態庫的優點
(1) 更加節省記憶體並減少頁面交換;
(2) so檔案與EXE檔案獨立,只要輸出介面不變(即名稱、引數、返回值型別和呼叫約定不變),更換so檔案不會對EXE檔案造成任何影響,因而極大地提高了可維護性和可擴充套件性;
(3) 不同程式語言編寫的程式只要按照函式呼叫約定就可以呼叫同一個so函式;
(4)適用於大規模的軟體開發,使開發過程獨立、耦合度小,便於不同開發者和開發組織之間進行開發和測試。
缺點
(1) 使用靜態連結生成的可執行檔案體積較大,包含相同的公共程式碼,造成浪費;
(2) 使用動態連結庫的應用程式不是自完備的,它依賴的so模組也要存在,如果使用載入時動態連結,程式啟動時發現DLL不存在,系統將終止程式並給出錯誤資訊。而使用執行時動態連結,系統不會終止,但由於so中的匯出函式不可用,程式會載入失敗;速度比靜態連結慢。當某個模組更新後,如果新模組與舊的模組不相容,那麼那些需要該模組才能執行的軟體,統統撕掉。
使用
靜態連結
靜態庫使用靜態連結的方法。
動態庫也可以使用靜態連結。
動態庫使用靜態連結的時候,載入程式碼就會把程式會用到的動態程式碼或動態程式碼的地址確定下來。
動態連結
動態連結方法,只有動態庫使用。
使用這種方式的程式並不在一開始就完成動態連結,而是直到真正呼叫動態庫程式碼時,載入程式才計算(被呼叫的那部分)動態程式碼的邏輯地址,然後等到某個時候,程式又需要呼叫另外某塊動態程式碼時,載入程式又去計算這部分程式碼的邏輯地址,所以,這種方式使程式初始化時間較短,但執行期間的效能比不上靜態連結的程式。