理解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”包生成的,用於描述構成相應庫的檔案。
廣告