- 靜態函式庫:lib*.a
- 鏈結的時候函式庫會整合到執行檔中,執行檔大
- 執行的時候,不需要再去找函式庫
- 升級函式庫之後,需要再次編譯一次執行檔
- 可以使用ar與ranlib指令將多個.o的檔案合併成為.a
- 動態函式庫:lib*.so
- 將多個.o的時候函式庫不會整合到執行檔中,執行檔小
- 執行的時候,需要再去找函式庫檔案,而且所在目錄不能改變
- 升級函式庫之後,不需要重新編譯執行檔
- 在Windows裡面檔名叫*.dll
- 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,也就是某些沒有背包到核心的驅動程式
參考資料
- 動態函式庫簡介:這邊有圖示說明static link與dynamic link是怎樣包含到執行檔上面
- 函式庫管理:很詳盡的說明,也有許多範例與指令使用法
- Linux動態&靜態函式庫解說:提到函式庫命名的法則
- Linux 的 .a / .so / .la 函式庫的差異:簡單舉例如何產生靜態與動態函式庫
- 使用 gcc 自製 C/C++ 靜態、共享與動態載入函式庫教學:舉了實際的例子
- Libtool初探
沒有留言:
張貼留言