我知道一个.so
文件是一种动态库(许多线程可以共享此类库,因此不需要在内存中拥有多个副本)。但有什么区别.a
and .la
?这些都是静态库吗?
如果动态库比静态库有很大优势,为什么仍然有很多静态库?我什么时候应该尝试将代码构建到.so
or .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
文件是动态库。该后缀代表“共享对象”,因为与该库链接的所有应用程序都使用同一文件,而不是在生成的可执行文件中创建副本。
.a
文件是静态库。后缀代表“archive”,因为它们实际上只是一个存档(用ar
命令——前身tar
现在仅用于创建原始 .o 目标文件的库。
.la
文件是GNU“libtools”包使用的文本文件来描述组成相应库的文件。您可以在这个问题中找到有关它们的更多信息:libtool 的 .la 文件有什么用? https://stackoverflow.com/questions/1238035/what-is-libtools-la-file-for
静态与动态
Static
Dynamic
-
Pro:您的进程的内存占用量较小,因为用于库的内存在使用该库的所有进程之间分摊。
-
Pro:可以在运行时按需加载库;这对插件有好处,因此您在编译和安装软件时不必选择要使用的插件。可以即时添加新插件。
-
Con:某人尝试安装应用程序的系统上可能不存在该库,或者他们的版本可能与该应用程序不兼容。为了缓解这种情况,应用程序包可能需要包含该库的副本,以便在必要时可以安装它。这通常也可以通过包管理器来缓解,包管理器可以下载并安装任何必要的依赖项。
-
Con:链接时优化通常是不可能的,因此可能会对高性能应用程序的效率产生影响。请参阅维基百科的讨论WPO 和 LTO https://en.wikipedia.org/wiki/Interprocedural_optimization#WPO_and_LTO.
动态库对于系统库特别有用,例如libc
。这些库通常需要包含依赖于特定操作系统和版本的代码,因为内核接口已经更改。如果将程序与静态系统库链接,则它将仅在为此库版本编写的操作系统版本上运行。但如果您使用动态库,它会自动选择您运行的系统上安装的库。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)