2018年3月27日 星期二

靜態函式庫.a 共享與動態函式庫.so

使用GCC編譯原始碼產生可執行檔(executable),連結部分要選擇做靜態函式庫(Static library或static-linked library)與動態連結函式庫(Dynamic library或dynamic-link library或Shared library)。通常這些函式庫的名稱如下:
  • 靜態函式庫:lib*.a
    • 鏈結的時候函式庫會整合到執行檔中,執行檔大
    • 執行的時候,不需要再去找函式庫
    • 升級函式庫之後,需要再次編譯一次執行檔
    • 可以使用arranlib指令將多個.o的檔案合併成為.a
  • 動態函式庫:lib*.so
    • 將多個.o的時候函式庫不會整合到執行檔中,執行檔小
    • 執行的時候,需要再去找函式庫檔案,而且所在目錄不能改變
    • 升級函式庫之後,不需要重新編譯執行檔
    • 在Windows裡面檔名叫*.dll 
要辨別某個執行檔PROGRAM是靜態連結還是動態連結,使用ldd這個指令:
  • ldd PROGRAM
  • ldd -v PROGRAM
結果會出現兩種情況:
  • 出現 not a dynamic executable:此執行檔為靜態連結
  • 出現一堆 libxxx.so:此執行檔需要顯示的動態函式庫

上面簡單的比較兩者函式庫的不同,在Linux系統與函式庫相關的檔案還有:
  • .o:用GCC編譯程式的時候出現的obj file,在Windows裡面結尾是.obj
  • .la:告訴libtool要如何把多個.o的檔案合併成為.a。這是一個文字檔,可以直接用文字編輯器開來看
  • .ko:Linux核心用到動態連結檔,都是系統開機時要掛載的module,也就是某些沒有背包到核心的驅動程式

參考資料

_EOF_

沒有留言:

張貼留言