函数库根据使用分为两类,分别是为静态函数库和动态函数库。
静态库特点
- 扩展名:为.a,例如,libxyz.a
- 编译操作:编译时会直接整合到可执行程序中,所以基于静态库编译成的可执行文件比较大。
- 独立执行:基于静态库编译成的可执行文件可以独立执行,不需要再向外部要求读取函数库的内容。
- 升级难度大:以为函数库是直接整合到了可执行文件中,升级函数库时,需要重新编译生成可执行文件。也就是说,只要函数库升级了,所有使用此静态函数库的程序都需要重新编译。
动态库的特点
- 扩展名:为.so,例如libxyz.so
- 编译操作:与静态库被整合到程序中不同的是,动态库在编译的时候,在程序里面只有一个【指针】的位置而已,也就是动态库的内容并没有被整合到可执行程序中,而是当执行文件要使用到函数库的功能时,程序才会去读取函数库来使用。由于执行文件中仅具有动态函数库所在的指针而已,并不包含函数库的内容,所以,执行文件会比较小。
- 不可独立执行:基于动态库编译出来的程序不能独立执行,因为当我们用到函数库的功能时,程序才会去读取函数库,所以函数库必须存在才行。而且函数库所在的目录也不能改变,因为我们的可执行文件里面仅有指针,也就是当要使用动态函数库时,程序会主动去某个路径下读取。所以,动态函数库不能随意移动或删除,否则,会影响很多依赖的程序软件。
- 容易升级:虽然库本身不能独立执行,然而由于具有指向的功能,所以,当函数库升级后,执行文件根本不需要重新编译的操作,因为执行文件会直接指向新的函数库文件(前提是新旧版本函数库的文件名相同)。
因为,动态库容易升级的优点,所以Linux系统发行版倾向于使用动态库。
这些动态库绝大多数放在/lib64与/lib目录中,此外,Linux系统里面很多函数库其实内核就提供了,放在/lib/modules里面。