理解Linux中的.a、.so和.la庫檔案


為了理解副檔名為.a、.so.la的庫檔案實際含義,我們首先必須瞭解Linux中庫的概念。簡單來說,Linux庫是預編譯程式碼段(稱為函式)的集合。庫非常有用,因為它們提供可重用的函式、類和資料結構。Linux中的一些庫示例包括glibc(GNU版本的標準C庫)和libc(C標準庫)。

總的來說,我們可以將Linux中的庫分為兩類:

  • 靜態庫

  • 動態庫

靜態庫

在編譯時連結到程式中的庫稱為靜態庫。它們也被稱為靜態連結庫,由一系列例程、外部函式和變數組成。在編譯時連結到程式後,連結器、繫結器或編譯器會將其複製到目標應用程式,從而生成目標檔案和獨立的可執行檔案。

這些型別的庫比共享庫快,因為常用的目標檔案集被放入單個庫可執行檔案中。

使用靜態庫的缺點是,用於構建它的程式碼被鎖定在最終的可執行檔案中,無法在不重新編譯庫的情況下修改。

靜態庫的副檔名為.a,其中.a代表“archive”(歸檔),以下輸出顯示了go原始碼中的一些靜態庫。

immukul@192 darwin_amd64 % ls -tlr
total 49376
-rw-r--r-- 1 root wheel 356788 Apr 1 23:13 unicode.a
-rw-r--r-- 1 root wheel 1023672 Apr 1 23:13 time.a
-rw-r--r-- 1 root wheel 1534494 Apr 1 23:13 syscall.a
-rw-r--r-- 1 root wheel 288140 Apr 1 23:13 sync.a
-rw-r--r-- 1 root wheel 501654 Apr 1 23:13 strings.a
-rw-r--r-- 1 root wheel 537834 Apr 1 23:13 strconv.a
-rw-r--r-- 1 root wheel 227774 Apr 1 23:13 sort.a

動態庫

作為可執行檔案外部的獨立檔案存在的庫稱為動態庫。在編譯時,程式只建立庫檔案的一份副本。

使用動態庫的好處是,單個庫可以被多個應用程式使用,而無需每個應用程式都擁有自己的庫副本(如靜態庫的情況)。

動態庫的缺點是,與靜態庫相比,其崩潰的可能性更高。一個簡單的例子是,如果動態庫損壞,可執行檔案可能無法工作。

副檔名為.so的檔案就是動態庫,“.so”代表共享物件。

請考慮以下輸出,它表示我的Ubuntu機器上/usr/lib資料夾中的一些動態庫。

輸出

lrwxr-xr-x 1 root wheel 27 Jan 1 2020 libhunspell-1.2.0.so
-rwxr-xr-x 1 root wheel 177440 Jan 1 2020 libgmalloc.so
-rwxr-xr-x 1 root wheel 104112 Jan 1 2020 libffi-trampolines.so
-rwxr-xr-x 1 root wheel 2851232 Jan 1 2020 libMTLCapture.so
-rwxr-xr-x 1 root wheel 137824 Jan 1 2020 libLeaksAtExit.so

.la檔案

副檔名為.la的檔案並非庫,而是包含庫描述的文字檔案。它們是由GNU“libtools”包生成的,用於描述構成相應庫的檔案。

更新於:2021年7月31日

4K+ 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告