(六)共享库
1. 共享库的兼容性
共享库版本的更新可能会导致接口的更改和删除,这可能导致依赖于该共享库的程序无法正常运行.
共享库的更新可以分为两类:
- 兼容更新,接口不变
- 不兼容更新,接口改变.
导致C语言的共享库ABI(二进制接口)改变的行为主要有如下4个:
- 导出函数的行为发生改变, 也就是说调用这个函数以后产生的结果与以前不一样, 不再满足旧版本规定的函数行为准则;
- 导出函数的接口发生改变, 如函数返回值,参数被更改;
- 导出函数被删除;
- 导出数据的结构发生变化, 比如共享库定义的结构体变量的结构发生改变: 结构成员删除,顺序改变或其他引起结构内存布局变化的行为(不过通常来讲,往结构体的尾部添加成员不会导致不兼容);
2. 共享库版本命名
为了解决共享库的兼容性问题, 有效的方法就是使用共享库版本的方法.
共享库的文件名规则如下:
libname.so.x.y.z
- x: 主版本号, 表示库的重大升级, 不同主版本号的库之间是不兼容的, 依赖于旧的主板本号的程序需要改动相应的部分,并且重新编译,才可以在新版本的共享库中运行;
- y: 次版本号, 表示库的增量升级, 即增加一些心得接口, 且保存原来的符号不变. 在主版本号相同的情况下, 高的次版本号的库向后兼容低的次版本号的库. 一个依赖于旧的次版本号共享库的程序, 可以在新的次版本号共享库中运行, 因为新版本中保留了原来所有的接口, 并且不改变它们的定义和含义;
- z: 发布版本号, 表示库的一些错误的修正,性能的改进等, 并不添加任何新的接口, 也不对接口进行更改. 相同主版本号,次版本号的共享库, 不同的发布版本号之间完全兼容, 依赖于某个发布版本号的程序可以在任何一个其他发布版本号中正常运行, 而无须做任何修改.