首页/系统/信创系统运维速查/程序缺库(shared object 找不到)
常见问题65 条

程序缺库(shared object 找不到)

程序启动报 cannot open shared object:用 ldd 找出缺失库,核对架构后在仓库中查找所属包安装,最后 ldconfig 刷新缓存。

信创系统运维速查系统更新于 2026-10-13

缺库报错的含义

程序启动时报无法打开某个共享库,说明动态链接器在标准搜索路径与程序指定的路径里都没找到需要的库文件。原因通常有三种:对应的库包没有安装、库文件存在但架构与程序不匹配、库被放在非标准目录而没有登记到搜索路径。

为什么要先核对架构

架构不匹配时,报错信息与新装软件包之前的现象几乎一样,都是找不到库。若不先确认程序与库的架构是否一致,很容易陷入反复安装同架构软件包的循环。用文件识别工具看待安装包与已有库的架构,能立刻排除这一类误判。

基本信息

诊断工具ldd 查看运行时依赖与缺失项
依赖清单readelf 读取程序声明需要的库
架构核对file 查看程序与库的架构标识
缓存刷新ldconfig 更新动态链接库缓存

典型使用场景

  • 业务程序在新环境启动即报缺少共享库
  • 手工编译的组件安装后运行时找不到自带的库
  • 迁移到新架构后程序报缺库,需要核对架构是否一致
  • 升级系统后旧程序因库版本变化启动失败
  • 排查依赖缺失造成的服务启动失败

定位

定位
ldd /opt/app/bin/app | grep -i 'not found'    # 缺失项清单
ldd /opt/app/bin/app | head                    # 完整依赖,确认版本指向
readelf -d /opt/app/bin/app | grep NEEDED | head   # 程序声明的依赖
file /opt/app/bin/app                          # 程序架构
file /opt/app/lib/libxxx.so.1 2>/dev/null       # 对照库文件架构是否一致

修复

修复
dnf provides '*/libxxx.so*'     # 查询哪个包提供该库
dnf install -y <包名>            # 优先用包管理器安装,而不是手工拷贝
# 自编译库放到非标准目录时:
echo /opt/app/lib > /etc/ld.so.conf.d/app.conf
ldconfig                        # 刷新缓存
ldd /opt/app/bin/app | grep -ci 'not found'    # 期望输出 0

缺库原因对照

原因特征处理
库包未安装ldd 直接列出缺失项用包管理器安装提供者包
架构不匹配库存在但仍报缺失核对并换成同架构的库
路径未登记库在程序目录内却找不到写入搜索路径配置并刷新缓存
版本不符存在同名不同版本库安装匹配版本或做兼容链接
权限异常库不可读导致加载失败修正文件权限与属主
优先通过包管理器获取库文件:手工拷贝来源不明的共享库既有版本兼容风险,也无法纳入后续的安全更新,出问题时更难追溯。

易错点

  • 不核对架构就反复重装软件包,架构不匹配的场景下永远修不好
  • 手工从别处拷贝共享库覆盖系统库,可能引发其他程序异常且无法回滚
  • 把库放到非标准目录后忘记刷新缓存,程序仍然找不到,误以为安装失败
  • 只看缺失项不查版本要求,装了同名库版本仍不满足,报错继续存在

数据来源与参考

  • man 8 ld.so
  • man 8 ldconfig
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌