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

时间:2012-09-02 15:38:11

标签: linux memory-management static-libraries ld shared-libraries

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

如果动态库比静态库有很大的优势,为什么还有很多静态库?

我还想了解加载库(两种类型)的基本机制,以及在某个地方使用lib时如何调用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

2 个答案:

答案 0 :(得分:263)

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

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

.la文件是GNU“libtools”软件包使用的文本文件,用于描述组成相应库的文件。您可以在此问题中找到有关他们的更多信息:What are libtool's .la file for?

静态和动态库各有利弊。

Static pro:用户总是使用您在应用程序中测试过的库版本,因此不会出现任何令人惊讶的兼容性问题。

静态控制:如果库中已修复问题,则需要重新分发应用程序以利用它。但是,除非它是一个用户可能自己更新的库,否则你可能需要这样做。

动态专家:您的进程内存占用较小,因为用于库的内存在使用该库的所有进程中分摊。

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

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

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

答案 1 :(得分:-1)

在给出的答案之上,还要说静态库就像一个目标文件的集合。当调用静态库中的函数或其他任何内容时,链接器会搜索库中的引用项并将定义引用项的目标文件添加到可执行文件中。另一方面,共享库就像一个由所有其他目标文件组成的单个大目标文件。因此,如果你在共享库中调用一个符号,那么所有的目标文件都会在可执行文件中被引用。