静态库,共享库和动态链接库的区别与联系

静态库优势:

  1. 静态库相当于复制一份库文件到项目代码中,不需要像动态库那样需要有动态加载,识别依赖函数地址的开销。

  2. 同样的,静态连接库文件比动态链接库文件需要更少的内存去搜寻函数在动加载或共享库中的地址。

缺点:

  1. 增加应用程序可执行文件的大小,因为它不能仅仅提取仅仅依赖的库函数到应用程序中。

  2. 库文件的更新不会反映到应用程序中,除非应用程序重新编译新的静态库。

共享库的优点:

  1. 相对于静态库,共享库能够在任何时候更新(修复bug,增加新的功能),并且能够被反映到应用程序中。

  2. 显著减少应用程序可执行文件占用的硬盘空间。

缺点:

  1. 使应用程序在不同平台上移植变得更复杂,因为它需要为每每个不同的平台提供相应平台的共享库。

ldd 查看某个程序的共享库依赖

  1. 增加应用程序运行时的时间和空间开销,因为应用程序需要在运行过程中查找相关的库函数依赖,并加载,这个功能是通过共享库加载器实现的。Linux 上是 /lib/ld.so, 文件 /etc/ld.so.cache 缓存在Linux系统上共享库位置信息。这个缓存文件是由 ldconfig 程序基于 /etc/ld.so.conf 生成的,而 /etc/ld.so.conf 保存着哪些Linux 路径目录能找找到共享库。

共享库的命名格式:

libxmns.so.1.2.3 1 major 2 minor 3 release

major 增加,原有函数接口已经不能使用,minor和release 复归于0

minor 增加, 新增加了一些函数接口,但原有函数接口还能使用, release 复归于0

release 增加,修改一些bug, 函数接口不变

动态链接库:

静态库和共享库都可以作为动态链接库。

动态链接库和(静态库以及共享库) 的区别在于 应用程序怎么使用它。

使用动态库的应用程序采用标准的API去打开动态链接库。 在C语言平台的Linux 上,这个标准的API 位于 <dlfcn.h> 文件中。<dlfcn.h> 文件中如何打开动态链接库、如何获取动态链接库的API 取决于不同的平台的具体实现,如Linux, Solaris, FreeBSD.
GNU Glibc 为动态链接库DL 提供了一个更为一般的接口, 去隐藏不同平台上动态链接库实现的区别,即libtool 工具,它是通过 /usr/lib/x86_64-linux-gnu/libltdl.so
实现的。
libtool 安装后包含的文件有:
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/lilele12211104/article/details/80393463