1. 共享库命名以libmath.so.1.2.3, 其中1是主版本号, 2是小版本号,3是build号. 主版本号的修改意味着接口的变化, 小版本号和build号的变化意味着bug fix
这个名字称为动态库的real name
2. libmath.so.1这个名字,这个成为动态库的soname, 共享库build时会把soname写入共享库文件头内
以后程序运行时就会利用其文件头中的soname去系统中搜索共享库
ln -s libmath.so.1.2.3 libmath.so.1
最后,这只是一个推荐机制, 而不是强制机制
在上述机制的背后有一个程序:ldconfig
ldconfig会去搜索/lilb和/usr/lib,以/etc/ld.so.conf内所列的目录下的库文件。
搜索出可共享的动态链接库,库文件的格式为:lib***.so.**(so后一定是三个数字?),进而创建出动态装入程序(ld.so)所需的连接和缓存文件。
缓存文件默认为/etc/ld.so.cache,该文件保存已排好序的动态链接库名字列表。
ldconfig通常在系统启动时运行,而当用户往/lib和/usr/lib里面加东西,是不用修改/etc/ld.so.conf文件的,但是添加完后需要调用下ldconfig, 如果安装在了其他目录下,则需要修改/etc/ld.so.conf文件内容, 然后手动运行ldconfig
简而言之:linux通过两个链接文件解决dll hell问题
一个例子:
一个库文件 libfreeimage-3.17.0.so
需要执行以下两个命令得到so文件
ln -s libfreeimage-3.17.0.so libfreeimage.so.3
ln -s libfreeimage.so.3 libfreeimage.so