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.sold-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

image

实际场景

编译项目时,报错:加载libmysqlclient.so.20出错,无法打开共享对象文件,没有该文件或目录

error while loading shared libraries: libmysqlclient.so.20:cannot open shared object file: No such file or directory

于是安装相应的mysql动态库,并按规则创建符号链接

image

再次编译,仍然报错,同样是找不到动态库文件

遂执行ldconfig,更新缓存,编译成功

ldconfig
posted @ 2024-06-03 22:48  lifeAddicted  阅读(60)  评论(0)    收藏  举报