动态与静态函数库学习

Posted 代萌

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态与静态函数库学习相关的知识,希望对你有一定的参考价值。

前言

软件之间都会互相使用彼此提供的函数库来进行特殊功能的运行。

函数库依照是否被编译到程序内部而分为动态函数库静态函数库

静态函数库

特点

  • 扩展名(.a):这类函数库扩展名为 libxxx.a 类型。
  • 编译行为:这类函数库在编译的时候会直接整合到可执行程序中,所以利用静态函数库编译成的文件会比较大一些
  • 独立执行的状态:这类函数库最大的优点就是编译成功的可执行文件可以独立运行,而不需要再向外部要求读取函数库的内容。
  • 升级难易度:虽然可执行文件可以独立运行,但是因为函数库是直接整合到可执行文件中,因此如果函数库升级时,整个可执行文件必须重新编译才能将新版本的函数库整合到程序中。也就是说,在升级方面,只要函数库升级了,所以将此函数库纳入的程序都需要重新编译。

动态函数库

特点

  • 扩展名(.so):这类函数库扩展名为 libxxx.so 类型。
  • 编译行为:动态函数库在编译的时候,在程序里面只有一个“指向”(Pointer)的位置而已。也就是说,动态函数库的内容并没有被整合到可执行文件中,而是当可执行文件要使用到函数库的机制时,程序才会去读取函数库来使用。由于可执行文件当中仅具有指向动态函数库所在的指标而已,并不包含函数库的内容,所有它的文件会比较小一点
  • 独立执行的状态:这类函数库所编译出来的程序不能被独立执行,因为当我们使用到函数库的机制时,程序才会去读取函数库,所以函数库文件必须要存在才行,而且,函数库所在的目录也不能改变,因为我们的可执行文件里面仅有“指标”,也就是要取用该动态函数库时,程序会主动去某个路径下读取,所以动态函数库可不能随意移动或删除,会影响很多相关的程序软件。
  • 升级难易度:函数库升级后,可执行文件根本不需要进行重新编译,因为可执行文件会直接指向新的函数库文件(前提是函数库新旧版本的文件名相同)。

在目前的Linux distribution倾向使用动态函数库,绝大多数函数库放置在/usr/lib、lib目录下。此外,Linux系统里面很多的函数库其实kernal就提供了,kernal的函数库在/lib/modules里面。

ldconfig 与 /etc/ld.so.conf

由于内存的访问速度是硬盘的好几倍,所以,如果将常用到的动态函数库先加载到内存当中(缓存,cache),那当软件要使用动态函数库时,就不需要从头由硬盘里面读出,这样就增进动态函数库的读取速度,要完成这种操作就需要 ldconfig 和 /etc/ld.so.conf 的协助。

将动态函数库加载高速缓存当中的步骤:

  1. 首先,必须在 /etc/ld.so.conf 里面写下想要读入高速缓存当中的动态函数库所在的目录,是目录而不是文件。
  2. 接下来利用 ldconfig 这个可执行文件将 /etc/ld.so.conf 的数据读入高速缓存当中。
  3. 同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中。
  4. //TODO ldconfig用法

以上是关于动态与静态函数库学习的主要内容,如果未能解决你的问题,请参考以下文章

静态库与动态库

Linux库函数制作(静态库动态库)

如何使用cmake生成基于静态库的动态链接库

动态库与静态库的区别

静态库与动态库

静态链接库与动态链接库的区别及动态库的创建(转)