.so文件是动态库。后缀代表“共享对象”,因为所有与该库链接的应用程序都使用同一文件,而不是在生成的可执行文件中进行复制。
.a文件是静态库。后缀代表“存档”,因为它们实际上只是原始.o目标文件的存档(使用ar命令制作- 该命令的前身tar现在仅用于制作库)。
.la文件是GNU“ libtools”软件包用来描述组成相应库的文件的文本文件。您可以在以下问题中找到有关它们的更多信息:libtool的.la文件有什么用?
静态库和动态库各有利弊。
静态专业人士:用户始终使用您在应用程序中测试过的库版本,因此不会出现任何令人惊讶的兼容性问题。
静态缺点:如果库中解决了问题,则需要重新分发应用程序以利用它。但是,除非它是一个用户可能自己更新的库,否则您可能仍然需要这样做。
Dynamic Pro:您的进程的内存占用量较小,因为用于库的内存在使用该库的所有进程之间摊销。
动态专业版:库可以在运行时按需加载;这对插件很有用,因此您无需在编译和安装软件时选择要使用的插件。可以随时添加新插件。
动态缺点:该库可能在某人试图安装该应用程序的系统上不存在,或者他们的版本可能与该应用程序不兼容。为了减轻这种情况,应用程序包可能需要包括库的副本,因此可以在必要时安装它。包管理器通常也可以缓解这种情况,包管理器可以下载并安装任何必要的依赖项。
动态库对于系统库尤其有用libc。这些库通常需要包含依赖于特定操作系统和版本的代码,因为内核接口已更改。如果将程序与静态系统库链接,则该程序将仅在为此库版本编写的OS版本上运行。但是,如果您使用动态库,它将自动获取运行在系统上的库。