针对Ubuntu下运行可执行文件出现的error while loading shared libraries: xxx.so的解决办法

本文介绍了在Linux环境下,当尝试执行某个程序遇到“errorwhileloadingsharedlibraries:xxx.so”的错误时,如何查找并配置缺失的动态链接库(.so文件)。主要步骤包括定位缺失的库文件、修改配置文件并使配置生效。

红色字体:需要注意的地方  蓝色字体:作者自己对系统中一些东东的称呼

学了Linux一小段时间,最近因为项目急就直接进行开发了。在下载一些Ubuntu的样例程序,程序文件夹中有可执行文件,每每在命令行使用./XXX执行它们之后总是说:

“error while loading shared libraries: xxx.so”

这样的错误,也就是说无法读取动态链接库。上网查到了解决的办法,根据高手们写的东西确实能够研究出来到底怎么配,不过我今天还是认真总结一下。


在shell下运行./XXX去执行可执行文件类型的文件时,若遇到了“error while loading shared libraries: xxx.so”错误解决步骤如下:

(1)系统中找到你缺少的那个xxx.so文件,记录下它所在文件夹的绝对路径;如果没有找到xxx.so文件,去网络上或者你的程序的官网上面去下载缺少的so库;总之就是,记录程序需要的动态链接库文件(.so)所在的文件夹的绝对路径。

(2)进入/etc文件夹(里面有很多文件),先找到id.so.conf文件,打开,在我的Ubuntu10中,该文件的内容是:

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

它的意思是系统编译时使用的动态链接库配置文件的位置,“*”代表着任意文件名,此时根据这行到/etc/ld.so.conf.d文件夹下,可以看到一堆.conf文件,任意打开一个,发现里面每行都是一个动态链接库所在文件夹的绝对路径,例如在libc.conf中写有“/usr/local/lib”。那么同样,如果你下载的程序使用到了自己的库,那么可以在/etc/ld.so.conf.d下新建一个xxx.conf文件,在其中写入步骤(1)中得到的所有需要的so文件的绝对路径,然后保存。你也可以以root身份打开已经存在的conf文件,在其后添加那些绝对路径,但是从长远的角度考虑,自己根据程序名新建一个.conf文件应该是最好的选择。

(3)在命令行中输入ldconfig使得步骤(2)的配置生效,然后再运行程序,就没有找不到库的问题啦~


本人菜鸟一个,第一次写东西没有很专业的术语,而且可能错误颇多,不慎惶恐,希望高手指点~

<think> 嗯,用户遇到了动态库加载失败的问题,错误信息是"error while loading shared libraries: libxxx.so.0: cannot open shared object file: No such file or directory"。这个问题在Linux开发中很常见,用户可能是开发者或者系统管理员。 从错误信息看,系统在运行时找不到特定的动态库文件libxxx.so.0。需要引导用户逐步排查几个关键点:首先是库文件是否存在,其次是环境变量配置是否正确,最后是权限和符号链接问题。 用户提供的引用内容很有价值,其中提到几个典型场景:库文件不在标准路径、LD_LIBRARY_PATH未设置、缺少版本符号链接等。特别注意到引用[3]提到自定义库路径的情况,引用[4]强调动态库搜索路径机制,这些都是解决问题的关键线索。 考虑给用户设计一个完整的排查流程:第一步用find命令确认库文件物理位置,第二步检查ldconfig缓存,第三步验证环境变量配置。如果这些基础步骤不奏效,再建议创建符号链接或直接修改ld.so.conf。最后要提醒用户注意版本号匹配问题,因为".so.0"这样的后缀很容易被忽视。 用户可能不太熟悉Linux的动态链接器机制,所以解释时需要把原理说得通俗些,比如把ldconfig缓存比作"通讯录",把LD_LIBRARY_PATH比作"临时路标"。在解决方案部分要保持技术严谨性,特别是ldconfig命令需要sudo权限这点必须明确提示。 这个问题的复杂性在于可能涉及多方面原因,但用户显然期待明确的解决步骤。因此回复要结构化,把五种解决方案按实施难度排序,最简单的"添加环境变量"放在前面,需要root权限的操作放在后面并加安全提示。 </think>好的,这个错误 `error while loading shared libraries: libxxx.so.0: cannot open shared object file: No such file or directory` 表示你的程序在运行时,系统**动态链接器**找不到它所需的共享库文件 `libxxx.so.0`。这是一个非常常见的 Linux 环境配置问题。解决思路主要是确保系统能找到这个库文件。以下是详细的解决方法: **核心原因:** 系统在默认搜索路径和配置的路径中找不到文件名为 `libxxx.so.0` 的动态链接库。 **解决方法:** 1. **确认库文件确实存在:** * 首先,你需要知道 `libxxx.so.0` 这个文件物理上存放在你系统的哪个目录下。它通常由你安装的某个软件包提供。 * 使用 `find` 命令搜索: ```bash sudo find / -name "libxxx.so*" 2>/dev/null ``` * 替换 `libxxx.so` 为你实际的库名前缀(例如,错误中的 `libxxx`)。 * 这个命令会在整个文件系统中搜索名称包含 `libxxx.so` 的文件,并将错误输出(如权限不足)重定向到 `/dev/null`(忽略)。 * 记下找到的 `libxxx.so.0` 文件(或类似版本文件,如 `libxxx.so.0.1.2`)所在的**完整路径**(例如 `/usr/local/lib/libxxx.so.0.1.2` 或 `/opt/someapp/lib/libxxx.so.0`)。 2. **检查 `ldconfig` 缓存(标准路径):** * 系统维护着一个共享库的缓存(`/etc/ld.so.cache`),该缓存由 `ldconfig` 命令生成。它主要包含 `/lib`, `/lib64`, `/usr/lib`, `/usr/lib64` 等标准路径下的库。 * 运行以下命令检查 `ldconfig` 是否知道 `libxxx.so.0`: ```bash ldconfig -p | grep libxxx.so.0 ``` * **如果找到:** 输出会显示库名和它指向的实际文件(通常是符号链接)。这表明库在标准路径且已被缓存,理论上应该能被找到。如果仍然报错,跳到第 5 步检查权限和符号链接。 * **如果没找到:** 说明库不在标准库路径或者路径未被 `ldconfig` 扫描。继续下面的步骤。 3. **添加库路径到 `LD_LIBRARY_PATH`(临时/用户级):** * 这是最常用且快速的解决方法,尤其适用于用户安装的库或特定应用的库。 * `LD_LIBRARY_PATH` 是一个环境变量,用于指定动态链接器在**运行时**搜索共享库的**额外路径**。 * 假设你在第 1 步找到了库文件,路径是 `/path/to/library_dir`(例如 `/usr/local/lib` 或 `/home/user/mylibs`)。 * 在运行你的程序**之前**,设置该变量: ```bash export LD_LIBRARY_PATH=/path/to/library_dir:$LD_LIBRARY_PATH ``` * 例如:`export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH` * 然后运行你的程序:`./your_program` * **优点:** 快速、简单,无需 root 权限。 * **缺点:** * 只在当前终端会话有效(关闭终端或开新终端需要重新设置)。 * 影响当前用户的所有后续程序(可能引入冲突)。 * 通常不推荐作为永久解决方案(特别是系统级库)。 * **如何永久化(仅对当前用户)?** 可以将 `export LD_LIBRARY_PATH=/path/to/library_dir:$LD_LIBRARY_PATH` 这行添加到你的 shell 启动文件(如 `~/.bashrc` 或 `~/.zshrc`)中,然后运行 `source ~/.bashrc`(或对应的文件)使其立即生效。 4. **将库路径添加到系统配置(永久/系统级):** * 这是更规范、系统级的解决方案。 * 编辑 `/etc/ld.so.conf` 文件或在 `/etc/ld.so.conf.d/` 目录下创建一个新的 `.conf` 文件(需要 `sudo` 权限): ```bash sudo nano /etc/ld.so.conf.d/myapp-libs.conf # 使用你喜欢的编辑器 (nano, vim等) ``` * 在打开的文件中,添加包含 `libxxx.so.0` 的目录的完整路径(每行一个路径): ``` /path/to/library_dir ``` * 例如:`/usr/local/lib` 或 `/opt/someapp/lib`。 * 保存并关闭文件。 * 运行以下命令更新动态链接器的缓存: ```bash sudo ldconfig ``` * **优点:** 永久生效,对所有用户和程序都可用。 * **缺点:** 需要 root 权限。 5. **检查库文件权限和符号链接:** * **权限:** 确保运行程序的用户对库文件本身(`libxxx.so.0` 或它指向的实际文件)以及它所在的目录有读取 (`r`) 和执行 (`x`) 权限。使用 `ls -l /path/to/library_dir/libxxx.so*` 查看权限。如果需要,使用 `chmod` 修改权限(谨慎操作)[^5]。 * **符号链接:** 库文件 `libxxx.so.0` 通常是一个指向实际版本文件(如 `libxxx.so.0.1.2`)的符号链接。确保这个符号链接存在且指向正确的文件。使用 `ls -l /path/to/library_dir/libxxx.so*` 查看链接关系。如果链接损坏或丢失,需要重新创建(需要写权限): ```bash cd /path/to/library_dir sudo ln -s libxxx.so.0.1.2 libxxx.so.0 # 假设实际文件是 libxxx.so.0.1.2 ``` * 执行 `sudo ldconfig` 更新缓存(如果修改发生在标准路径或已配置路径)。 6. **检查版本号(`.0` 后缀):** * 错误信息明确要求 `libxxx.so.0`。确认你系统中存在的库文件版本是否匹配。 * 库文件通常遵循 `lib<name>.so.<major>.<minor>.<patch>` 的命名约定(如 `libxxx.so.0.1.2`)。符号链接 `libxxx.so.0` 指向主版本号相同的最高小版本(如 `libxxx.so.0 -> libxxx.so.0.1.2`)。 * 如果系统里只有 `libxxx.so.1` 而没有 `libxxx.so.0`,说明程序编译时链接的是主版本 0 的库,而你安装的是主版本 1 的库。它们可能不兼容。你需要: * 安装兼容的(主版本为0的)`libxxx` 库包。 * 或者(如果可能且兼容)创建一个指向 `libxxx.so.1` 的符号链接 `libxxx.so.0`(**不推荐**,除非你确定兼容,容易导致问题): ```bash cd /path/to/library_dir sudo ln -s libxxx.so.1 libxxx.so.0 sudo ldconfig ``` * 或者重新编译你的程序,使其链接到新版本的库 (`libxxx.so.1`)。 7. **重新安装提供该库的软件包:** * 如果 `libxxx.so.0` 应该是由某个系统包(如 `libxxx0` 或 `libxxx-0`)提供的,但它似乎丢失或损坏了,尝试重新安装它: * Debian/Ubuntu: `sudo apt install --reinstall libxxx0` (用实际的包名替换 `libxxx0`) * RHEL/CentOS: `sudo yum reinstall libxxx0` 或 `sudo dnf reinstall libxxx0` (用实际的包名替换 `libxxx0`) * 如果库来自你自己编译安装的软件,确保 `make install` 步骤正确执行,且安装到了系统路径(如 `/usr/local/lib`)或你配置的路径,并记得运行 `sudo ldconfig`。 **总结步骤建议:** 1. **`find`** 库文件位置。 2. **`ldconfig -p | grep`** 检查是否在缓存中。 * 如果在缓存中 -> 检查**第 5 步**(权限/链接)。 * 如果不在缓存中 -> 继续。 3. 尝试 **`LD_LIBRARY_PATH`** (临时测试)。 * 解决了?-> 考虑是否需要永久化(添加到 `~/.bashrc` 或使用 **第 4 步**)。 * 没解决?-> 继续。 4. 使用 **第 4 步** 将路径添加到系统配置 (`/etc/ld.so.conf.d/` + `sudo ldconfig`)。 5. 无论以上是否解决,检查**第 5 步**(权限/符号链接)。 6. 检查**第 6 步**(版本号是否匹配)。 7. 考虑**第 7 步**(重新安装包)。 按照这个流程,通常都能解决 `cannot open shared object file` 的错误。最常见有效的解决方案是 **设置 `LD_LIBRARY_PATH`** 或 **将路径添加到 `/etc/ld.so.conf.d/` 并运行 `sudo ldconfig`** [^1][^2][^3][^4]。 [^1]: error while loading shared libraries: xxx.so: cannot open shared object file: No such file o。已解决:动态库加载失败:error while loading shared libraries: xxx.so: cannot open shared object file: No such file or directory。 [^2]: error while loading shared libraries: libxxx.so通用解决方法。./lenet: error while loading shared libraries: libcudnn.so.7: cannot open shared object file: No such file or directory。 [^3]: 解决error while loading shared libraries: libXXX.so.X: cannot open shared object file: No such file。运行hello程序时,用到了自己编写的动态库,在目录/usr/local/lib目录下,运行时出现 error while loading shared libraries: libhello.so.1: cannot open shared object file: No such file or directory。 [^4]: 动态库报错:error while loading shared libraries: libxxx.so: cannot open shared o。  在使用动态库以后,生成自己的可执行文件myapp会运行失败。 报错: error while loading shared libraries: libxxx.so: cannot open shared object file: No such file or directory 原因:动态库找不到。 ./myapp --> 运行失败。 [^5]: error while loading shared libraries: libSNPE.so: cannot open shared object file: No such file。高通平台:文件明明有权限,提示Permission denied-优快云博客 具体错误 /bin/snpe-net-run: error while loading shared libraries: libSNPE.so: cannot open shared object file: No such file or directory 解决办法1。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值