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

我知道一个.so文件是一种动态库(大量的线程可以共享这些库,因此不需要在内存中拥有多个副本)。 但.a.la什么.la ? 这些都是静态库吗?

如果动态库与静态库相比有很大优势,为什么仍然有很多静态库?

我也想知道加载库的基本机制(这两种类型)以及在某处使用库中的一段代码时如何调用它。 我应该学习哪一部分内核? 我应该知道什么相关的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

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

.a文件是静态库 。 后缀代表“归档”,因为它们实际上只是原始.o对象文件的归档文件(由ar命令构成,它是tar的前身,现在仅用于创建库)。

.la文件是由GNU“libtools”包使用的文本文件,用于描述组成相应库的文件。 你可以在这个问题中找到更多关于他们的信息:什么是libtool的.la文件?

静态和动态库都有优点和缺点。

静态专业版:用户始终使用您的应用程序测试过的库的版本,因此不应该有任何令人惊讶的兼容性问题。

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

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

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

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

链接地址: http://www.djcxy.com/p/64375.html

上一篇: What's the difference between .so, .la and .a library files?

下一篇: Statically linking libraries in MinGW