理解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+ 次浏览

开启你的职业生涯

完成课程获得认证

开始学习
广告
© . All rights reserved.