首页 文章

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

提问于
浏览
176

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

如果动态库比静态库有很大的优势,为什么还有很多静态库呢?

我还想知道加载库(两种)的基本机制,以及在某个地方使用它时如何调用lib中的一段代码 . 我应该学习哪一部分内核?我应该知道相关的Linux命令/实用程序,以了解进程是如何运行的? (我现在只知道 ld 命令)

我什么时候应该尝试将代码构建到 .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 回答

  • 243

    .so 个文件是 dynamic libraries . 后缀代表"shared object",因为与库链接的所有应用程序都使用相同的文件,而不是在生成的可执行文件中复制 .

    .a 个文件是 static libraries . 后缀代表"archive",因为它们实际上只是原始.o目标文件的归档(使用 ar 命令 - 现在只用于制作库的 tar 的前身) .

    .la 文件是 text files used by the GNU "libtools" package 来描述组成相应库的文件 . 您可以在此问题中找到有关它们的更多信息:What are libtool's .la file for?

    静态和动态库各有利弊 .

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

    静态con:如果在库中修复了问题,则需要重新分发应用程序以利用它 . 但是,除非它是一个用户可能自己更新的库,否则你可能需要这样做 .

    动态专业版:您的流程的内存占用量较小,因为用于库的内存在使用该库的所有进程中摊销 .

    动态专业版:可以在运行时按需加载库;这对插件很有用,因此在编译和安装软件时不必选择要使用的插件 . 可以动态添加新插件 .

    动态con:库可能不存在于某人尝试安装应用程序的系统上,或者他们可能具有与应用程序不兼容的版本 . 为了缓解这种情况,应用程序包可能需要包含库的副本,因此可以在必要时安装它 . 包管理器通常也可以减轻这一点,它可以下载并安装任何必要的依赖项 .

    动态库对于系统库特别有用,例如 libc . 这些库通常需要包含在您运行的系统上安装的代码 .

相关问题