ldconfig
ldconfig - configure dynamic linker run-time bindings
配置动态链接器运行时绑定
概述
ldconfig会创建必要的链接,并缓存到指定目录中的最新共享库
指定目录在3个地方定义
- 命令行指定
etc/ld.so.conf配置文件- 可信目录
/lib和/usr/lib
在某些64位架构上(如x86-64),
/lib和/use/lib是32位库的可信目录;/lib64和/usr/lib64是64位库可新目录
这些缓存(the cache)会被运行时链接器使用,ld.so或ld-linux.so
在确定哪些版本需要更新链接时,ldconfig会检查遇到的库的头文件和文件名
ldconfig通常需要超级用户运行,因为它可能需要某些root用户拥有的目录和文件的写入权限
ldconfig只会查看名为lib*.so*(普通共享对象)或ld-*.so*(动态加载器本身所用)的文件
软链接创建规则
其他文件会被忽略。此外,ldconfig还希望符号链接以固定模式设置,例如下面例子
中间文件(libfoo.so.1)是库的SONAME(Shared Object Name——库文件的共享对象名称)
libfoo.so -> libfoo.so.1 -> libfoo.so.1.12
这个规则就是.so.主版本号.子版本号,层级越高,位于链接的越上层
不遵循此模式可能会导致升级后出现兼容性问题
常用选项
ldconfig # 无选项时,刷新缓存(将新安装的库加入缓存)
-p # 打印当前缓存中存储的目录列表和候选库
举个例子,查找mysql动态库是否正确安装并可以找到
ldconfig -p | grep mysql

实际场景
编译项目时,报错:加载libmysqlclient.so.20出错,无法打开共享对象文件,没有该文件或目录
error while loading shared libraries: libmysqlclient.so.20:cannot open shared object file: No such file or directory
于是安装相应的mysql动态库,并按规则创建符号链接

再次编译,仍然报错,同样是找不到动态库文件
遂执行ldconfig,更新缓存,编译成功
ldconfig

浙公网安备 33010602011771号