Linux系统下解决:tar (child):XXX: Cannot open: No such file or directory问题

本来用的Linux的Centos系统,想用Linux 的Ubuntu系统,于是就把阿里云更换系统盘一切重新开始了。

问题描述

在安装jdk的时候遇到了问题

我是这样操作的

sudo tar -xvzf jdk-8u201-linux-x64.tar.gz

结果:
在这里插入图片描述

报错翻译:

tar(child):jdk-8u201-linux-x64.tar.gz:无法打开:没有这样的文件或目录
tar(child):错误无法恢复:现在退出 tar:孩子返回状态2
tar:错误无法恢复:现在退出

原因是告诉我们找不到jdk文件,但是我明明已经把jdk放在了/opt路径下。

解决办法

尝试了很多的解决办法都无法解决,直到我意识到会不会是安装包存放的位置也有讲究。

我的解决办法:
采用第一种添加完整路径的办法

sudo tar -xvzf /opt/jdk-8u201-linux-x64.tar.gz

原因

出现这个问题,原因有多种

  • 账号权限不足造成的,使用sudo执行则解决
  • 压缩包损坏
  • 磁盘空间不足,可以df /home -h查看/home是否已满
  • 默认的linux共享库搜索路径为/lib和/usr/lib目录,若共享库不在这两个路径,进程运行时不能自动链接,按照默认共享库路径找不到该共享库文件。

前三种情况不予讲解了,烦请自行排查,看一下第四种原因的解决办法

找不到该共享库文件

默认的linux共享库搜索路径为/lib和/usr/lib目录,若共享库不在这两个路径,进程运行时不能自动链接(比如安装程序后共享库在/usr/local/bin),此时一般有下面4种方法解决:

一般有下面4种方法解决

方法一:链接时使用静态库,编译脚本或者命令中指明jdk文件的完整路径

即上面我的解决办法:使用绝对路径

方法二:将文件直接复制到可搜索的路径中

默认的linux共享库搜索路径为/lib和/usr/lib目录,可以把文件复制到/lib或/usr/lib目录下

cp -r 文件  目标路径

然后再进行操作

方法三:添加搜索路径,使用ldconfig

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

# 执行命令
cat /etc/ld.so.conf
# 没有编辑过/etc/ld.so.conf文件会输出:include ld.so.conf.d/*.conf
# 把新共享库目录加入到共享库配置文件 
echo "/usr/local/lib" >> /etc/ld.so.conf
# 执行 ldconfig 命令
ldconfig

方法四:修改LD_LIBRARY_PATH环境变量

如果共享库文件安装到了其它"非/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 里加入以下语句即可:

1、打开Terminal(终端)
2、输入:vi ~/.bash_profile
3、设置LD_LIBRARY_PATH:export LD_LIBRARY_PATH=/opt:$LD_LIBRARY_PATH
4、输入::wq //保存并退出vi
5、修改立即生效:source ~/.bash_profile
6、查看环境变量的值:echo $LD_LIBRARY_PATH
7、如果bash_profile存在的情况下,可以通过open ~/.bash_profile的命令打开,编辑好后再执行5的方式

注意⚠️:
1、~/.bash_profile中有个点
2、如果是新增环境变量或者是修改环境变量的值,都需要source一下才能立即生效。如果是删除一个环境变量,必须输入exit以logout当前shell,然后再重新打开一个新的shell并login才能生效


但是个人认为使用第四种方法比较好(虽然我是用第一个方法解决的),应该这样可以一劳永逸

但是近期收到很多小伙伴的留言和私聊,以上方法貌似还不能完全解决部分同学的问题,正好最近在协助一个同学解决同款问题,等解决了,我再来更新最新的解决办法。

1.根据提示获得找不到路径的共享库的安装路径,使用locate命令,先用updatedb更新locate的索引库“/var/lib/mlocate/mlocate.db”,然后locate xxx.so查找,比如自动编译安装的库文件放在/usr/local/lib;
2.修改/etc/ld.so.conf,在文本结尾添加路径即可,比如加一行/usr/local/lib。
3.使用ldconfig更新记录系统中so文件的缓存文件“/etc/ld.so.cache”。

  • 58
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 31
    评论
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鲲志说

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值