当前位置: 首页 > 知识库问答 >
问题:

. so、. la和. a库文件之间有什么区别?

单于扬
2023-03-14

我知道一个。所以文件是一种动态库(很多线程可以共享这样的库,所以不需要在内存中有多个副本)。但是之间有什么区别呢。a。洛杉矶?这些都是静态库吗?

如果动态库比静态库有很大的优势,为什么仍然有很多静态库?我应该什么时候尝试将代码构建. 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个答案

穆彬郁
2023-03-14

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

艾照
2023-03-14

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

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

。la文件是GNU“libtools”包用来描述组成相应库的文件的文本文件。你可以在这个问题中找到更多关于它们的信息:libtool的是什么。洛杉矶档案馆?

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

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

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

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

Dynamic pro:库可以在运行时按需加载;这对插件很好,所以在编译和安装软件时不必选择要使用的插件。可以动态添加新插件。

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

动态约束:链路时间优化通常是不可能的,因此在高性能应用中可能会影响效率。参见维基百科关于WPO和LTO的讨论。

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

 类似资料:
  • 问题内容: 我参与了有关Linux库的一些辩论,并想确认一些事情。 以我的理解(如果我做错了请纠正我,稍后我将编辑我的文章)在构建应用程序时有两种使用库的方式: 静态库(.a文件):在链接时,会将整个库的副本放入最终应用程序中,以便调用方应用程序始终可以使用库中的功能 共享对象(.so文件):在链接时,仅通过相应的标头(.h)文件针对其API验证了对象。该库直到需要运行时才真正使用。 静态库的明显

  • 我是Android编程新手。我使用Eclipse作为开发的IDE。我已经启动了一个新项目,一些jar文件被自动添加到项目中。你能解释一下这些jar文件的含义吗? Android4.4.2 android.jar < Li > Android-support-V7-app compat . jar < li>android-support-v4.jar appcompat_v7_2.jar andr

  • 问题内容: 我知道一个API称为一组用于调用某些东西的函数,一个库是一个类的集合,但是像这样的包中的API实际上是什么?我可以在不使用任何API的情况下连接到类似的类,那么为什么我们称其为J2SE API而不是J2SE软件包? 问题答案: 直接来自维基百科: 在计算机科学中,应用程序编程接口(API)是定义应用程序可以从库请求服务的方式的接口 Java在那些软件包中包含许多库(Swing等),而A

  • 问题内容: 在此示例中: 无法编译为: 而被编译器接受。 这个答案说明唯一的区别是,与不同,它允许您稍后引用类型,似乎并非如此。 是什么区别,并在这种情况下,为什么不第一编译? 问题答案: 通过使用以下签名定义方法: 并像这样调用它: 在jls§8.1.2中,我们发现(有趣的部分被我加粗了): 通用类声明定义了一组参数化类型(第4.5节), 每种可能通过类型arguments调用类型参数节的类型

  • 问题内容: cacerts和密钥库之间有什么区别? 如果我使用在这些链接中找到的定义cacerts和keystore,则它们似乎是证书的集合,但是是在(Java)分布式系统的上下文中。SSL连接期间使用哪一个进行身份验证?两者还是只是其中之一,还是交替? 问题答案: “ cacerts”是一个信任库。信任库用于验证对等方。密钥库用于验证您的身份。

  • 问题内容: libtool的文件有哪些用途?它们如何与共享库一起使用? 问题答案: 它是一个文本文件,其中包含对库的描述。 它允许创建与平台无关的名称。 例如,转到: 在Linux下: 在Cygwin下: 在Windows MinGW下: 所以是由平台之间保留的唯一文件,允许以理解与发生了什么: 库依赖 实际文件名 库版本和修订 无需依赖特定平台的库实现。