共享库版本命名
Linux 有一套规则来命名系统中的每一个共享库。它规定系统中的每一个动态库命名规则必须如下:
libname.so.x.y.z
- 最前面使用前缀
lib
,中间是库的名字和后缀.so
,最后面跟着三个数字组成的版本号。 -
x
表示主版本号 -
y
表示次版本号 -
z
表示发布版本号
主版本号表示库的重大升级,不同主版本号之间是不兼容的。
次版本号表示库的增量升级,即增加一些新的接口符号,且保持原来的符号不变。
发布版本号表示库的一些错误修正,性能的改进,并不添加任何新的接口。
SO-NAME
每一个共享库都有一个对应的SO-NAME
,这个SO-NAME
即共享库的文件名去掉次版本号和发布版本号,保留主版本号。
在Linux 中,系统会为每一个共享库在它所在的目录创建一个 跟"SO-NAME"相同并且指向它的软链接,比如系统种有存在一个共享库/lib/libfoo.so.2.6.1
,那么Linux共享库管理程序就会为它产生一个软链接/lib/libfoo.so.2
指向它。
那么以"SO-NAME"创建软链接有什么好处呢?
这个软链接会指向目录种版本号相同,次版本号和发布版本号最新的共享库。
建立以"SO-NAME"为名字的软链接的目的是:使得所有依赖某个共享库的模块,在编译链接,
链接名
共享库的查找过程
共享库的系统路径
目前在内的大多是Linux 操作系统都遵守一个叫做FHS的标准,这个标准规定iyge系统种的系统文件应该如何存放,包括各个目录的结构,组织和作用。FHS 规定一个系统中主要有3个存放共享库的位置。
- /lib
存放系统最关键的基础的共享库,比如动态链接器,C语言运行库,数学库。 - /usr/lib
保存一些开发相关的库。 - /usr/local/lib
主要存放一些第三方应用程序的的库。
在开源系统中,动态链接器是/lib/ld-linux.so.X
,程序所依赖的共享对象全部由动态链接器负责装载和初始化。
共享库的创建和安装
共享库的创建
创建共享库最关键是使用2个参数:
-fPIC
表示使用地址无关代码的技术来生产输出文件。
-shared
表示输出结果是共享库的类型。
共享库的安装
最简单的方法就是将共享库复制到某个标准的共享库目录,如/lib
和/usr/lib
,然后运行ldconfig
命令即可