了解 Linux 中的 .a 、 .so 和 .la 库文件

为了理解扩展名为.a、.so.la的文件库的实际含义,我们首先必须了解 Linux 中库的概念。用非常简单的术语来说,Linux 是一组预编译的代码段,这些代码段称为函数。库非常有用,因为它们提供了可重用的函数、类和数据结构。Linux 中的一些库示例是glibc(标准 C 库的 GNU 版本)、libc(C 标准库)。

总的来说,我们可以将 Linux 中的库分为两类。这些类别是 -

  • 静态库

  • 动态库

静态库

在编译时锁定在程序中的库称为静态库。它们也称为静态链接库,如果由一组例程、外部函数和变量组成。在编译时锁定程序后,它会被链接器、绑定器或编译器复制到目标应用程序,然后生成目标文件和独立的可执行文件。

这些类型的库比共享库更快,因为一组常用的目标文件被放入单个库可执行文件中。

使用静态库的缺点是用于构建它的代码被锁定在最终的可执行文件中,如果不重新编译库就无法修改它。

静态库有一个.a扩展名,其中.a代表“归档”,下面的输出显示了 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”包生成,用于描述组成相应库的文件。