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

我知道一个.so文件是一种dynamic库(大量的线程可以共享这样的库,所以不需要在内存中有多个拷贝)。 但.a.la什么.la ? 这些都是静态库吗?

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

我也想知道加载库的基本机制(这两种types)以及在某个地方使用某个lib中的一段代码的方式。 我应该学习哪一部分内核? 我应该知道什么相关的Linux命令/实用程序才能知道进程是如何运行的? (我现在只知道ld命令)

什么时候应该尝试将代码构build到.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 

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

.a文件是静态库 。 后缀代表“归档”,因为它们实际上只是原始.o对象文件的一个归档文件(由ar命令构成 – 是tar的前身,现在只是用于创build库)。

.la文件是GNU“libtools”包使用的静态库 。 你可以在这个问题中find更多关于它们的信息: 什么是libtool的.la文件?

静态和dynamic库都有优点和缺点。

静态专业版:用户总是使用您的应用程序testing的库的版本,所以不应该有任何令人惊讶的兼容性问题。

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

dynamic专家:你的进程的内存占用较小,因为用于库的内存在使用该库的所有进程之间被分摊。

dynamic专业版:可以在运行时按需加载库; 这对插件很有用,所以在编译和安装软件时不需要select插件。 新的插件可以在飞行中添加。

dynamic库对系统库尤其有用,如libc 。 这些库经常需要包含依赖于特定操作系统和版本的代码,因为内核接口已经改变了。 如果您将某个程序与静态系统库链接,则该程序将只在该库版本的操作系统版本上运行。 但是,如果您使用dynamic库,它将自动选取安装在您运行的系统上的库。