.so,.la和.a库文件有什么区别?


230

我知道.so文件是一种动态库(很多线程可以共享这样的库,因此在内存中不需要多个副本)。但是.a和之间有什么区别.la?这些都是静态库吗?

如果动态库比静态库具有很大的优势,那么为什么仍然有很多静态库?

我还想知道加载库(两种)的基本机制,以及在某处使用lib时如何调用一段代码。我应该学习内核的哪一部分?我应该了解什么相关的Linux命令/实用程序才能知道进程如何运行?(我现在只知道ld命令)

什么时候应该尝试将代码内置到.so或中.a?哪一个更好?

[mirror@home ins_openvpn]$ ls lib/openvpn/plugins/ -l
total 96
-rw-r--r-- 1 mirror mirror 22892 Sep  2 23:25 openvpn-plugin-auth-pam.a
-rwxr-xr-x 1 mirror mirror   931 Sep  2 23:25 openvpn-plugin-auth-pam.la
-rwxr-xr-x 1 mirror mirror 23621 Sep  2 23:25 openvpn-plugin-auth-pam.so
-rw-r--r-- 1 mirror mirror 17228 Sep  2 23:25 openvpn-plugin-down-root.a
-rwxr-xr-x 1 mirror mirror   932 Sep  2 23:25 openvpn-plugin-down-root.la
-rwxr-xr-x 1 mirror mirror 18805 Sep  2 23:25 openvpn-plugin-down-root.so

Answers:


306

.so文件是动态库。后缀代表“共享对象”,因为所有与该库链接的应用程序都使用同一文件,而不是在生成的可执行文件中进行复制。

.a文件是静态库。后缀代表“存档”,因为它们实际上只是原始.o目标文件的存档(使用ar命令制作- 该命令的前身tar现在仅用于制作库)。

.la文件是GNU“ libtools”软件包用来描述组成相应库的文件的文本文件。您可以在以下问题中找到有关它们的更多信息:libtool的.la文件有什么用?

静态库和动态库各有利弊。

静态专业人士:用户始终使用您在应用程序中测试过的库版本,因此不会出现任何令人惊讶的兼容性问题。

静态缺点:如果库中解决了问题,则需要重新分发应用程序以利用它。但是,除非它是一个用户可能自己更新的库,否则您可能仍然需要这样做。

Dynamic Pro:您的进程的内存占用量较小,因为用于库的内存在使用该库的所有进程之间摊销。

动态专业版:库可以在运行时按需加载;这对插件很有用,因此您无需在编译和安装软件时选择要使用的插件。可以随时添加新插件。

动态缺点:该库可能在​​某人试图安装该应用程序的系统上不存在,或者他们的版本可能与该应用程序不兼容。为了减轻这种情况,应用程序包可能需要包括库的副本,因此可以在必要时安装它。包管理器通常也可以缓解这种情况,包管理器可以下载并安装任何必要的依赖项。

动态库对于系统库尤其有用libc。这些库通常需要包含依赖于特定操作系统和版本的代码,因为内核接口已更改。如果将程序与静态系统库链接,则该程序将仅在为此库版本编写的OS版本上运行。但是,如果您使用动态库,它将自动获取运行在系统上的库。


1
@Barmar,所以您是说静态库的优点胜过动态库的优点?
起搏器

4
@Pacerier我不知道你从哪里得到的。
Barmar 2015年

13
这是一个毫无意义的问题。优缺点的权重取决于情况,没有统一的答案。似乎您有一个议程,您正在尝试诱饵我。
Barmar 2015年

3
@ Barmar,Nop,我是无辜的。只是个好奇者。
Pacerier

11
另一个因素是许可-LGPL要求在商业环境中进行动态链接,即您不想分发源的地方。
山姆
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.