Linux 的 .a / .so / .la 函式庫的差異

Linux 的 *.a / .so / .la 在下述位置可以參考看看(Debian): (沒有在路徑內的應該是沒裝此 Library)

  • /usr/lib/x86_64-linux-gnu/ 有 *.a, *.so
  • /usr/lib/x86_64-linux-gnu/ImageMagick-6.7.7/modules-Q16/coders/ 有 *.la
  • /lib/modules/3.2.0-4-amd64/kernel/net/wireless/*.ko

Linux 的 .a / .so / .la 函式庫的差異

下述參考自此篇: Linux 下 .a / .so / .la 函式庫區別

  • .o (obj file) 是目標物件函式庫, 等同於 Windows 的 .obj
  • .a 為靜態函式庫, 可以是 一個 或 多個 .o 合在一起, 用於靜態連結
  • .la 為 libtool 生成的共享函式庫, 其實是個設定的檔案. 可以用 file 代替
  • .la 可用 vi 來查看
  • .so 為動態函式庫, 類似 Windows 的 DLL(Dynamic-link library)檔.
  • 補充: 還有一種附檔名為 .ko 的檔案, 不過它是 Linux 核心使用的動態連結文件, 屬於模組程式, 用來在 Linux 系統啟動時, 加掛核心模組用.

.o, .a, .so, .la 如何產生

  • 建立 .o
    $ gcc -c test.c
  • 建立 .a
    $ ar -r libtest.a test1.o test2.o
  • 建立動態函式庫 .so
    $ gcc -Wall -fpic -shared test1.c test2.c -o libtest.so
  • 鍊結函式庫
    $ gcc -Wall -fpic -shared -Ltest test3.c -o libtest.so
  • 建立 .la, .la 一般會使用 Makefile 產生, 可以透過下述命令產生:
    $ libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料