動態庫和靜態庫的特性

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中的導出函數不可用,程序會加載失敗;速度比靜態鏈接慢。當某個模塊更新後,如果新模塊與舊的模塊不兼容,那麼那些需要該模塊才能運行的軟件,統統撕掉。

使用

靜態鏈接

靜態庫使用靜態鏈接的方法。

動態庫也可以使用靜態鏈接。

動態庫使用靜態鏈接的時候,載入代碼就會把程序會用到的動態代碼或動態代碼的地址確定下來。

動態鏈接

動態鏈接方法,只有動態庫使用。

使用這種方式的程序並不在一開始就完成動態鏈接,而是直到真正調用動態庫代碼時,載入程序才計算(被調用的那部分)動態代碼的邏輯地址,然後等到某個時候,程序又需要調用另外某塊動態代碼時,載入程序又去計算這部分代碼的邏輯地址,所以,這種方式使程序初始化時間較短,但運行期間的性能比不上靜態鏈接的程序。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章