Ubuntu18 “error while loading shared libraries: xxx.so.x“ 错误的原因和解决方法

当在Linux系统中运行程序时,如果遇到找不到共享库如libvtkRenderingCore8.2.so.1的错误,可能是因为缺少库文件或路径设置不正确。解决方法包括:1) 安装缺失的库;2) 使用ldconfig更新库路径;3) 如果库在非标准目录下,可以编辑/etc/ld.so.conf加入路径后运行ldconfig,或者设置LD_LIBRARY_PATH环境变量。这些步骤能确保程序正确找到所需共享库。

在Linux下执行某些外部程序的时候可能会提示找不到共享库的错误, 比如:
error while loading shared libraries: libvtkRenderingCore8.2.so.1: cannot open shared object file: No such file or directory

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

另外一个原因就是已经安装了该共享库, 但执行需要调用该共享库的程序的时候, 程序按照默认共享库路径找不到该共享库文件.

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

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

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

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

终端:cat /etc/ld.so.conf
显示内容:include ld.so.conf.d/*.conf
终端执行命令:sudo echo “/usr/local/lib” >> /etc/ld.so.conf(如果没有权限。sudo chmod 777 /etc/ld.so.conf)
终端:sudo ldconfig

或者直接在ld.so.conf里面加入库的路径,然后执行 sudo ldconfig 即可

  1. 如果共享库文件安装到了其它"非/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

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

 

了解更多关于《计算机视觉与图形学》相关知识,请关注公众号:

在这里插入图片描述
下载我们视频中代码和相关讲义,请在公众号回复:计算机视觉课程资料

<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。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值