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

2024-02-23

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

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

  • Con:如果库中的问题得到解决,您需要重新分发应用程序才能利用它。但是,除非它是用户可能自行更新的库,否则您可能需要执行此操作。

Dynamic

  • Pro:您的进程的内存占用量较小,因为用于库的内存在使用该库的所有进程之间分摊。

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

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

  • Con:链接时优化通常是不可能的,因此可能会对高性能应用程序的效率产生影响。请参阅维基百科的讨论WPO 和 LTO https://en.wikipedia.org/wiki/Interprocedural_optimization#WPO_and_LTO.

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.so、.la 和 .a 库文件有什么区别? 的相关文章

  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • C 程序从连接到系统的 USB 设备读取数据

    我正在尝试从连接到系统 USB 端口的 USB 设备 例如随身碟 获取数据 在这里 我可以打开设备文件并读取一些随机原始数据 但我想获取像 minicom teraterm 这样的数据 请让我知道我可以使用哪些方法和库来成功完成此操作以及如
  • 如何在特定 systemd 服务重新启动时触发自定义脚本运行

    我想知道如何安排自定义脚本在重新启动服务时运行 我的用例是 每当重新启动 Tomcat 服务时 我都必须运行多个命令 我想知道是否有一种方法可以编写脚本并安排它在重新启动 Tomcat 服务时运行 我已将 tomcat 脚本设置为 syst
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 设置 Apache POI 的路径

    我想创建 Excel 文件并使用 java 程序在该文件中写入数据 That is here http www techbrainwave com p 554我在 java 文件所在的位置提取了 Apache POI 并将该路径包含在路径变
  • 在主目录中安装库

    在 Linux Ubuntu 中 我尝试运行一个工具 但它显示错误 库丢失 我无权在系统中安装任何内容 或者根本无法从我的用户帐户执行 sudo 是否可以在我的主目录 没有 sudo 中安装缺少的库 在我的例子中为 libstdc so 6
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • 在 Linux 上的 Python 中使用受密码保护的 Excel 工作表

    问题很简单 我每周都会收到一堆受密码保护的 Excel 文件 我必须解析它们并使用 Python 将某些部分写入新文件 我得到了文件的密码 当在 Windows 上完成此操作时 处理起来很简单 我只需导入 win32com 并使用 clie
  • ansible 重新启动 2.1.1.0 失败

    我一直在尝试创建一个非常简单的 Ansible 剧本 它将重新启动服务器并等待它回来 我过去在 Ansible 1 9 上有一个可以运行的 但我最近升级到 2 1 1 0 并且失败了 我正在重新启动的主机名为 idm IP 为 192 16
  • 在 Mac OS X 上构建 Linux 内核

    我正在做一个修改Linux内核的项目 我有一台桌面 Linux 机器 在上面构建内核没有问题 不过 我要去旅行 我想在途中工作 我只有一台 MacBook 当我尝试构建 Linux 内核时 它抱怨说elf h was not found 我
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • 跟踪 Linux 程序中活跃使用的内存

    我想跟踪各种程序在特定状态下接触了多少内存 例如 假设我有一个图形程序 最小化时 它可能会使用更少的内存 因为它不会重新绘制窗口 这需要读取图像和字体并执行大量库函数 这些对象仍然可以在内存中访问 但实际上并没有被使用 类似的工具top它们
  • 从 csv 文件中删除特定列,保持输出上的相同结构[重复]

    这个问题在这里已经有答案了 我想删除第 3 列并在输出文件中保留相同的结构 输入文件 12 10 10 10 10 1 12 23 1 45 6 7 11 2 33 45 1 2 1 2 34 5 6 I tried awk F 3 fil
  • 使用yarn 2工作区在monorepo中的两个项目之间共享打字稿代码

    我想在打字稿中建立一个包含客户端部分 react app 服务器部分 express 和共享库 utils 的项目 我使用yarn 2工作区并希望避免使用larna 如果可能的话 不幸的是 几天以来我一直无法让它工作 并且进行了大量的谷歌搜
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 在不支持线程的程序加载的共享库中使用 C++11 多线程

    我目前正在尝试在共享库中使用 C 11 多线程 该库加载到 Linux 上的主程序 用 C 编写 中 这是一个大型模拟程序的一部分 我无法更改有关库加载的任何内容或更改一般的主程序 主程序是用 gcc 4 1 2 编译的 我没有它的源代码
  • nginx 上的多个网站和可用网站

    通过 nginx 的基本安装 您的sites available文件夹只有一个文件 default 怎么样sites available文件夹的工作原理以及如何使用它来托管多个 单独的 网站 只是为了添加另一种方法 您可以为您托管的每个虚拟
  • gdb查找行号的内存地址

    假设我已将 gdb 附加到一个进程 并且在其内存布局中有一个文件和行号 我想要其内存地址 如何获取文件x中第n行的内存地址 这是在 Linux x86 上 gdb info line test c 56 Line 56 of test c
  • 为什么 Linux perf 使用事件 l1d.replacement 来处理 x86 上的“L1 dcache misses”?

    在英特尔 x86 上 Linux用途 https stackoverflow com a 52172985 149138事件l1d replacements来实施其L1 dcache load misses event 该事件定义如下 计数

随机推荐

  • XSLT定义一个变量并检查它是否存在

    我正在尝试转换 XML 文档 首先 我定义一个全局变量
  • 使用 dask 合并大型数据集

    我有两个数据集 一个约为 45GB 包含 1 年的日常交易 第二个数据集为 3 6GB 包含客户 ID 和详细信息 我想将两者合并到一个公共列上以创建一个数据集 这超出了服务器的内存 因为每个客户可能有多个交易 我正在开发一个具有 16 个
  • 可变结构体字段

    我知道可变字段在 0 6 中被删除了 我使用此代码收到以下错误 C Users mflamer Dropbox Rust Tests gmap rs 23 8 23 18 错误 分配给不可变字段 C Users mflamer Dropbo
  • 寻找 .NET 的命令行参数解析器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 什么时候应该使用 Localize 控件而不是 Literal?

    我最近意识到System Web UI WebControls Localize http msdn microsoft com en us library system web ui webcontrols localize aspxAS
  • 在 .net、winforms 中显示用户控件后,我可以捕获的最后一个可能的事件是什么?

    正如标题所示 我正在寻找一个在用户控件显示后捕获的事件 目前 我必须设置一个 do once 变量并捕获 Invalidated 事件 关于什么可见变化 http msdn microsoft com en us library syste
  • 无法删除 Android Studio 中的目录

    今天我将 Android Studio 更新到 2 0 当我运行我的项目时出现此错误 Error Execution failed for task app clean gt Unable to delete directory media
  • 删除 MongoDB 数据库中的所有内容

    我正在 MongoDB 上进行开发 出于完全非邪恶的目的 我有时想清除数据库中的所有内容 即删除每个集合以及周围可能存在的任何其他内容 然后从头开始 是否有一行代码可以让我做到这一点 提供 MongoDB 控制台方法和 MongoDB Ru
  • 使用 jQuery 从输入值中删除给定的字符串

    我有一个包含三个整数值的隐藏字段 例如
  • 在 Microsoft Edge 中打开跨源窗口时忽略 window.open() 参数

    在 Microsoft Edge 中 以下代码片段将忽略传递给的选项window open when url与当前域的来源不同 但它在 Chrome 和 Firefox 中运行良好 并且当域是同源时 const popupWindow wi
  • libavformat/ffmpeg 与 x264 和 RTP 同步时出现问题

    我一直在开发一些实时直播的流媒体软件 来自各种摄像机和网络流使用 H 264 为了实现这一点 我直接使用 x264 编码器 使用 零延迟 预设 并提供 NAL 因为它们可用于 libavformat 打包到 RTP 最终是 RTSP 中 理
  • Epson打印机连接失败状态ERR_CONN

    我有一台 Epson 打印机 我使用 SDK 提供的 epos2 printer 示例项目 代码与我的应用程序集成 我复制了相同的代码 但它似乎永远不起作用 但是 当我将示例项目连接到打印机时 效果相同 private boolean ru
  • 安卓谷歌登录不可用?

    所以我的项目遇到的一个问题是通过谷歌登录不能一致工作 即 它适用于我的朋友 而不是我的计算机上的我 尽管它昨天在擦除我的手机之前对我有用 手机已损坏 我们的登录代码是google登录的标准 问题是我认为结果一直返回false 代码 prot
  • 为什么我们不能在 firebase 身份验证中使用 getUid() 向您的后端服务器进行身份验证

    在此代码片段 firebase 文档 中 他们提到不要使用 user getUid 向后端服务器进行身份验证 请改用 FirebaseUser getToken FirebaseUser user FirebaseAuth getInsta
  • 如何使用 CakePHP 检查模型是否存在?

    我在通用函数中动态加载模型 我注意到有时我想跳过加载模型 因为它会引发 404 错误 如何检查模型是否存在 就像是 if this gt modelexists type this gt loadModel type else return
  • 如何使用 PHP 的curl 函数从上次重定向中获取标头?

    如果我执行设置为遵循重定向并返回标头的 cURL 请求 它将返回所有重定向的标头 我只想要返回最后一个标头 以及内容正文 我该如何实现这一目标 这是另一种方法 url http google com opts array CURLOPT R
  • 如何使用带有文字点的 Perl 哈希键?

    我有一个 Perl 中的哈希值 它已从一些遗留代码转储到其中 键名现在已从简单的 reqHdrs 更改为 reqHdrs bla rec gt reqHdrs bla 我的问题是现在我似乎无法从哈希访问该字段有什么想法吗 以下是我的错误 D
  • 在 R 中的 ggplot geom_bar 中强制条形图从低于 0 的值开始

    我想使用 ggplot 绘制条形图 我使用scale y log10 来重新缩放y 轴 当使用下面的脚本时 我得到两个方向 向上和向下 的条形图 并且条形图从 1 开始 我明白这是因为 log10 1 0 ggplot data dat a
  • 开发自定义锁屏[重复]

    这个问题在这里已经有答案了 我想开发看起来像 iPhone 锁屏的自定义锁屏应用程序 有这方面的教程或示例吗 如果没有 我应该从哪里开始 Android SDK 不支持创建 自定义锁屏 aap 您只能在自定义固件中修改锁屏行为 UPDATE
  • .so、.la 和 .a 库文件有什么区别?

    我知道一个 so文件是一种动态库 许多线程可以共享此类库 因此不需要在内存中拥有多个副本 但有什么区别 a and la 这些都是静态库吗 如果动态库比静态库有很大优势 为什么仍然有很多静态库 我什么时候应该尝试将代码构建到 so or a