理解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”包生成的,用于描述构成相应库的文件。
广告
数据结构
网络
关系数据库管理系统 (RDBMS)
操作系统
Java
iOS
HTML
CSS
Android
Python
C语言编程
C++
C#
MongoDB
MySQL
Javascript
PHP