Hello,小伙伴们,大家好!最近有小伙伴问我程序库相关的问题。程序库的存在很大程度上提高了程序的复用性、可维护性,但是程序库的应用往往对于初学者来说有些摸不清头脑,所以这一期本文从Linux的角度谈谈Linux下的程序库。
库文件一般就是编译好的二进制文件,用于在链接阶段同目标代码一起生成可执行文件,或者运行可执行文件的时候被加载,以便调用库文件中的某段代码。库文件无法直接执行,因为它的源代码中没有入口主函数,而只是一些函数模块的定义和实现,所以无法直接执行。程序库使程序更加模块化,重新编译更快,更新更容易
为了便于理解,将程序库可以分为三种类型:静态库、共享库和动态加载(DL)库
Linux下静态库以.a结尾的库文件
静态库
。Linux下共享库以.so结尾的库文件
在Linux系统中我们经常看到同一个共享库还有软连接文件指向共享库。一般来说一个共享库有三个名字:soname、real-name、linker-name
soname
上加上一个小数点、一个小号、另一个小数点和发布号。最后期间和版本号是可选的。次要编号和版本号通过让你确切知道安装了哪些版本的库来支持配置控制。请注意,这些数字可能与文档中用于描述库的数字不同Linux系统上这样做的目的主要是系统中允许不同版本的库文件共存,一般在命名库文件的时候通常与soname相同
/lib/ld-linux.so.2 --library-path 可执行路径
动态加载库(dynamically loaded (DL) libraries)是指在程序运行过程中加载的函数库。而不是像共享库一样在程序启动的时候加载。在Linux中,动态库的文件格式跟共享库没有区别,主要区别在于共享库是程序启动时加载,而动态加载库是运行的过程中加载。可以理解为动态加载库是共享库的另一种调用方式。DL对于实现程序模块化很有用处,因为它可以让程序在运行时进行模块升级。
在Linux系统中,实现动态加载库的调用,有一个用于打开库、查找符号、处理错误和关闭库的API。C程序需要包含头文件<dlfcn.h>才能使用这些API,具体相关的API使用我们放在下一节详解
库 | 特点 |
---|---|
静态库 | 静态链接库在程序编译时会被链接到目标代码中,目标程序运行时将不再需要库,移植方便,但是体积较大,因为所有相关的库内容都被链接合成一个可执行文件,这样导致可执行文件的体积较大 |
共享库 | 动态库在程序编译时并不会被链接到目标代码中,而是在程序运行时才被载入,因为可执行文件体积较小。有了动态库,程序的升级会相对比较简单,只需要替换动态库的文件,而不需要替换可执行文件 |
动态加载库 | 动态库的文件格式跟共享库没有区别,主要区别在于共享库是程序启动时加载,而动态加载库是运行的过程中加载。可以理解为动态加载库是共享库的另一种调用方式 |
本节只针对Linux下库的概念及分类做详细阐述,下一节将详细讲解如何通过程序创建属于我们自己的库文件,包括创建静态库、共享库、动态加载库的实现等