前言
软件之间都会互相使用彼此提供的函数库来进行特殊功能的运行。
函数库依照是否被编译到程序内部而分为动态函数库与静态函数库。
静态函数库
特点
- 扩展名(.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 的协助。
将动态函数库加载高速缓存当中的步骤:
- 首先,必须在 /etc/ld.so.conf 里面写下想要读入高速缓存当中的动态函数库所在的目录,是目录而不是文件。
- 接下来利用 ldconfig 这个可执行文件将 /etc/ld.so.conf 的数据读入高速缓存当中。
- 同时也将数据记录一份在 /etc/ld.so.cache 这个文件当中。
- //TODO ldconfig用法