Linux程序找不到共享库 .so 文件

运行 Linux 程序的时候提示找不到共享库错误: error while loading shared libraries: libLinuxCpp_02_Lib.so: cannot open shared object file: No such file or directory。

Linux程序在加载 so 库文件时,搜索顺序依次如下所示。如果所有的位置都找不到,就会爆以上的错误信息,提示找不到共享库。因此优先级也是从上到下依次降低,即如果多个地方都进行了不同的设置,则会按照优先级高的设置进行搜索

  1. rpath 信息,编译链接时写入到可执行文件内部的数据
  2. LD_LIBRARY_PATH 环境变量
  3. runpath 信息,编译链接时写入到可执行文件内部的数据
  4. /etc/ld.so.conf 文件中列出的路径
  5. /lib、/usr/lib 等系统默认路径

对于运行时找不到共享库,常用的有三种方式:

  • 编辑自己的 .conf文件
  • 添加临时环境变量 LD_LIBRARY_PATH
  • 将.so 文件拷贝到系统默认加载共享库的路径:/lib/usr/lib

方法一、添加编辑自定义 .conf 文件

该方式为发布程序时,加载附加 .so文件的常用方法,可以避免修改系统自带的 .conf 文件,也是较为推荐的方法。

1、创建自定义 .conf 文件
# 进入到 /etc/ld.so.conf.d 目录下
cd /etc/ld.so.conf.d/

# 创建 xxx.conf 文件,文件名称自定,文件类型必须为 .conf
sudo vim libCustom.conf
2、将依赖.so文件路径添加进来

在新建的 libCustom.conf 文件中,添加所依赖的 .so 文件的路径,以告诉系统在哪里去找对应的共享库。然后保存并退出。

/home/projects/LinuxCpp_02_Lib/bin/x64/Debug/

3、更新动态链接库缓存

sudo ldconfig 执行更新动态链接库缓存的命令,以保证新增加的共享库能够被系统识别。然后执行可执行程序将不会提示找不到共享库的错误。


方法二、添加环境变量 LD_LIBRARY_PATH

1、在当前终端中设置临时环境变量

  • 将只对当前终端运行该程序时有效,为临时设置便于测试,临时生效

export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: </home/projects/LinuxCpp_02_Lib/bin/x64/Debug>

2、为当前用户添加环境变量
编辑当前用户的配置文件 ~/.bashrc,并在末尾添加对应的环境变量命令,将对该用户永久生效

# 1. 打开当前用户配置文件
sudo vim ~/.bashrc

# 2. 在末尾添加环境变量路径,并保存退出
export LD_LIBRARY_PATH = $LD_LIBRARY_PATH: </home/projects/LinuxCpp_02_Lib/bin/x64/Debug>

# 3. 在shell中执行如下命令,让以上的修改立刻生效
source ~/.bashrc

方法三、将 .so 文件复制到系统库目录下

sudo cp <target.so> /usr/lib


【注意】当要查看一个可执行程序依赖的库信息,以及查找某个库或其它文件在当前系统上的位置时,可以使用如下的操作。

1. 查找可执行文件依赖库信息的命令:

ldd <target.out> :该命令会列出可执行程序所依赖的共享库信息

2. 查找具体的文件在什么位置:

locate <file>:该命令会列出查到的文件的绝对路径


【参考资料】
【linux】程序找不到动态库.so的解决办法|查看.so动态库信息|.so动态库加载顺序
一文读懂Linux下动态链接库版本管理及查找加载方式

posted @   Jeffxue  阅读(195)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
历史上的今天:
2023-10-18 Qt 读写文件操作
点击右上角即可分享
微信分享提示