.so、.la、.a库文件有什么区别?
- 2024-11-06 08:35:00
- admin 原创
- 33
问题描述:
我知道.so
文件是一种动态库(许多线程可以共享此类库,因此无需在内存中保存多个副本)。但是.a
和之间有什么区别.la
?这些都是静态库吗?
如果动态库比静态库有很大优势,为什么仍然有很多静态库?我什么时候应该尝试将代码构建到.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
解决方案 1:
文件类型细分
.so
文件是动态库。后缀代表“共享对象”,因为与库链接的所有应用程序都使用同一个文件,而不是在生成的可执行文件中进行复制。
.a
文件是静态库。后缀代表“存档”,因为它们实际上只是原始 .o 目标文件的存档(使用ar
命令创建 - 该命令的前身tar
现在仅用于创建库)。
.la
文件是GNU“libtools”软件包用来描述组成相应库的文件的文本文件。您可以在此问题中找到有关它们的更多信息:libtool 的 .la 文件有什么用?
静态与动态
静止的
优点:用户始终使用您在应用程序中测试过的库版本,因此不会出现任何令人惊讶的兼容性问题。
缺点:如果库中的问题已修复,您需要重新分发应用程序才能利用它。但是,除非该库是用户可能会自行更新的库,否则您可能还是需要这样做。
动态的
优点:您的进程的内存占用更小,因为用于该库的内存在使用该库的所有进程之间分摊。
优点:库可以在运行时按需加载;这对插件来说很好,因此您不必在编译和安装软件时选择要使用的插件。可以随时添加新插件。
缺点:有人试图安装应用程序的系统上可能不存在该库,或者他们安装的版本可能与应用程序不兼容。为了缓解这种情况,应用程序包可能需要包含库的副本,以便在必要时安装它。包管理器通常也可以缓解这种情况,它可以下载并安装任何必要的依赖项。
缺点:链接时优化通常是不可能的,因此在高性能应用程序中可能会影响效率。请参阅 Wikipedia 对WPO 和 LTO的讨论。
动态库对于系统库(如)尤其有用libc
。这些库通常需要包含依赖于特定操作系统和版本的代码,因为内核接口已经发生了变化。如果您将程序与静态系统库链接,它将仅在为此库版本编写的操作系统版本上运行。但是,如果您使用动态库,它将自动选择您运行的系统上安装的库。
解决方案 2:
除了给出的答案之外,还要说静态库就像是对象文件的集合。当调用静态库中的函数或其他任何内容时,链接器会在库中搜索引用的项目,并将定义引用项目的对象文件添加到可执行文件中。另一方面,共享库就像一个由所有其他对象文件组成的单个大对象文件。因此,如果您在共享库中调用符号,则可执行文件中会引用所有对象文件。
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件