hug*_*eow 216 linux memory-management shared-libraries ld static-libraries
我知道.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
Run Code Online (Sandbox Code Playgroud)
Bar*_*mar 287
.so文件是动态库.后缀代表"共享对象",因为与库链接的所有应用程序都使用相同的文件,而不是在生成的可执行文件中复制.
.a文件是静态库.后缀代表"归档",因为它们实际上只是原始.o目标文件的归档(使用ar命令 - tar现在只用于制作库的前身).
.la文件是GNU"libtools"包使用的文本文件,用于描述组成相应库的文件.你可以在这个问题中找到关于它们的更多信息:什么是libtool的.la文件?
静态和动态库各有利弊.
静态专业版:用户始终使用您在应用程序中测试过的库版本,因此不会出现任何令人惊讶的兼容性问题.
静态con:如果库中的问题得到修复,则需要重新分发应用程序以利用它.但是,除非它是一个用户可能自己更新的库,否则你可能需要这样做.
动态专业版:您的进程的内存占用量较小,因为用于库的内存在使用该库的所有进程中分摊.
动态专业版:可以在运行时按需加载库; 这对插件很有用,因此在编译和安装软件时不必选择要使用的插件.可以动态添加新插件.
动态con:库可能不存在于某人尝试安装应用程序的系统上,或者他们可能具有与应用程序不兼容的版本.为了缓解这种情况,应用程序包可能需要包含库的副本,因此可以在必要时安装它.包管理器通常也可以减轻这一点,它可以下载并安装任何必要的依赖项.
动态库对于系统库尤其有用libc.这些库通常需要包含依赖于特定操作系统和版本的代码,因为内核接口已经更改.如果将程序与静态系统库链接,它将仅在为此库版本编写的OS版本上运行.但是,如果您使用动态库,它将自动选择您运行的系统上安装的库.
| 归档时间: |
|
| 查看次数: |
105862 次 |
| 最近记录: |