动态库 soname

编译了一个动态库,生成了好几个文件,有libname.so,libname.so.x, libxx.so.x.y,libxx.so.x.y.z,都有什么区别?

Linux中命名系统中共享库的规则

动态库 soname_第1张图片

libname.so.x.y(或libname.so.x.y.z,最后一个版本号可不要)这种是真正的库文件,libname.so 和 libname.so.x一般是指向libname.so.x.y 的软链接。

链接 libname.so.x是的作用是为了动态库升级方便,一般在编译真正的库libname.so.x.y的时候,通过参数指定soname为libname.so.x(https://man7.org/conf/lca2006/shared_libraries/slide4b.html),app在运行时会根据soname去查找libname.so.x,这样就算库升级了(libname.so.x.yy),只要soname不变(libname.so.x),app运行时依然还是查找libname.so.x,这时候只需要修改libname.so.x指向新的库libname.so.x.y即可。

链接 libname.so的作用我理解的是为了app编译方便,链接时只需要加上 -lname,链接时会自动查找libname.so文件(即libname.so.x.y),读取其soname(libname.so.x)保存,运行时根据soname找到libname.so.x,即libname.so.x.y。

总结,每次更新升级了动态库,只需要替换libname.so.x.y(或libname.so.x.y.z如果有),这样app不需要重新编译(因为soname没有变)。而且app有需要编译的时候也不用修改链接的库名。

库的soname可以通过 readelf -d libname.so.x.y 查看,app保存的库的soname可以通过 ldd appname 查看。

你可能感兴趣的:(C/C++)