Linux程序执行时报:“error while loading shared libraries: xxx.so” 错误解决方法

当在Linux系统中运行程序时,可能会遇到'error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory'的错误。这通常是因为缺少或版本不匹配的共享库。解决方法包括:1) 安装缺失的库;2) 执行`ldconfig`更新缓存;3) 如果库在非标准路径,更新`/etc/ld.so.conf`并运行`ldconfig`,或者设置`LD_LIBRARY_PATH`环境变量。确保正确配置共享库路径以避免此类问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们在Linux下执行某些程序的时候可能会提示找不到共享库的错误:

"error while loading shared libraries: libprotobuf.so.9: cannot open shared object file: No such file or directory"

原因一般有两个:

一是:操作系统里确实没有包含该共享库(lib*.so.*文件)或者共享库版本不对,遇到这种情况那就去网上下载并安装上即可。

二是:已经安装了该共享库,但执行需要调用该共享库的程序的时候,程序按照默认共享库路径找不到该共享库文件。

比如:执行protobuf示例代码时报该错,但在目录/usr/local/lib下我们可以看到libprotobuf.so.9是存在的。

所以安装共享库后要注意共享库路径设置问题,如下:

1)如果共享库文件安装到了/lib或/usr/lib目录下, 那么需执行一下ldconfig命令。

ldconfig命令的用途,主要是在默认搜寻目录(/lib和/usr/lib)以及动态库配置文件/etc/ld.so.conf内所列的目录下,搜索出可共享的动态链接库(格式如lib*.so*),进而创建出动态装入程序(ld.so)所需的链接和缓存文件。缓存文件默认为/etc/ld.so.cache,此文件保存已排好序的动态链接库名字列表。

2)如果共享库文件安装到了/usr/local/lib(很多开源的共享库都会安装到该目录下)或其它“非/lib或/usr/lib”目录下,那么在执行ldconfig命令前,还要把新共享库目录加入到共享库配置文件/etc/ld.so.conf中,如下:

# cat /etc/ld.so.conf

include ld.so.conf.d/*.conf

# echo "/usr/local/lib" >> /etc/ld.so.conf

# ldconfig

3)如果共享库文件安装到了其它“非/lib或/usr/lib”目录下, 但是又不想在/etc/ld.so.conf中加路径(或者是没有权限加路径)。那么可以export一个全局变量LD_LIBRARY_PATH,然后运行程序的时候就会去这个目录中找共享库。

LD_LIBRARY_PATH的意思是告诉loader在哪些目录中可以找到共享库。可以设置多个搜索目录,这些目录之间用冒号分隔开。比如安装了一个mysql到/usr/local/mysql目录下,其中有一大堆库文件在/usr/local/mysql/lib下面,则可以在.bashrc或.bash_profile或shell里加入以下语句:

export LD_LIBRARY_PATH=/usr/local/mysql/lib:$LD_LIBRARY_PATH   

一般来讲这只是一种临时的解决方案,在没有权限或临时需要的时候使用。

### Java运行时缺少`libjli.so`库的解决方案 当遇到 `java: error while loading shared libraries: libjli.so: cannot open shared object file: No such file or directory` 错误时,这通常是由于 JDK 安装过程中某些共享库文件缺失或路径配置不当引起的。以下是详细的分析和解决方法: #### 1. **确认JDK安装完整性** 如果在解压或传输 JDK 文件到目标机器的过程中发生中断或损坏,则可能导致部分必要文件丢失。建议重新下载并解压 JDK 到指定目录。 ```bash tar -zxvf jdk-xxx-linux-x64.tar.gz -C /usr/local/ ``` 确保 `/usr/local/jdk/lib/` 下存在 `libjli.so` 文件[^4]。 --- #### 2. **设置动态链接库路径** Linux 系统通过 `LD_LIBRARY_PATH` 环境变量来查找动态链接库。如果没有正确配置该变量,可能会导致找不到所需的 `.so` 文件。 可以通过以下命令临时设置环境变量: ```bash export LD_LIBRARY_PATH=/usr/local/jdk/lib:$LD_LIBRARY_PATH ``` 为了永久生效,可以将其写入用户的 shell 配置文件(如 `.bashrc` 或 `.zshrc`)中: ```bash echo 'export LD_LIBRARY_PATH=/usr/local/jdk/lib:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc ``` 验证是否成功加载库文件: ```bash ldd $(which java) | grep libjli.so ``` 如果有输出类似于以下内容则表示正常: ``` libjli.so => /usr/local/jdk/lib/amd64/jli/libjli.so (0x...) ``` --- #### 3. **检查系统依赖关系** 有时即使设置了正确的路径,仍可能出现问题。这是因为系统的 glibc 版本或其他基础库版本过低,无法满足 JDK 的需求。可通过以下方式更新必要的软件包: 对于 CentOS/RHEL 用户,可尝试升级 glibc 和其他相关工具链: ```bash yum update -y yum install -y gcc make autoconf automake libtool zlib-devel bzip2 bzip2-devel readline-devel sqlite sqlite-devel openssl-devel xz xz-devel libffi-devel ``` 之后再次测试 JDK 是否能正常使用。 --- #### 4. **修复权限问题** 如果 `libjli.so` 存在于预期位置但仍报错,可能是由于文件权限不足引起。调整文件权限如下: ```bash chmod +r /usr/local/jdk/lib/* chown root:root /usr/local/jdk/lib/* -R ``` --- #### 5. **重装JDK** 若以上方法均未奏效,考虑完全移除现有 JDK 并重新安装最新稳定版。注意选择与操作系统架构相匹配的版本(如 x86_64 对应于 64 位 Linux 系统)。 --- ### 示例代码:验证Java版本 完成上述操作后,使用以下脚本来验证 Java 是否能够正常工作: ```bash #!/bin/bash if command -v java &> /dev/null; then echo "Java is installed." java_version=$(java -version 2>&1 | awk -F '"' '/version/ {print $2}') echo "Current version: ${java_version}" else echo "Java not found!" fi ``` 保存为 `check_java.sh` 并赋予执行权限: ```bash chmod +x check_java.sh ./check_java.sh ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值