【问题标题】:What's the difference between .so, .la and .a library files?.so、.la 和 .a 库文件有什么区别?
【发布时间】:2012-08-27 13:35:46
【问题描述】:

我知道.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

【问题讨论】:

标签: linux shared-libraries static-libraries ld


【解决方案1】:

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

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

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

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

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

静态问题:如果问题在库中得到解决,您需要重新分发您的应用程序以利用它。但是,除非它是用户可能自行更新的库,否则无论如何您都可能需要这样做。

Dynamic pro:您的进程的内存占用更小,因为用于库的内存在使用该库的所有进程中分摊。

Dynamic pro:库可以在运行时按需加载;这对插件有好处,因此您在编译和安装软件时不必选择要使用的插件。可以即时添加新插件。

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

Dynamic con:链接时间优化通常是不可能的,因此在高性能应用程序中可能会影响效率。请参阅WPO and LTO 的维基百科讨论。

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

【讨论】:

  • @Pacerier 我不知道你从哪里得到的。
  • 这是一个毫无意义的问题。利弊的重量取决于具体情况,没有普遍的答案。看来你有一个议程,你想引诱我。
  • @Barmar,不,我是无辜的。只是一个好奇的人。
  • 另一个因素是许可 - LGPL 需要在商业环境中进行动态链接,即您不想分发源代码。
  • @DavidS 我认为 LGPL 只是为了提供一个使用受限的库的示例。用例子来说明一点没有错。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2015-07-23
    • 2010-11-10
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2012-04-06
    • 2021-01-26
    • 1970-01-01
    相关资源
    最近更新 更多