当前位置: 首页>>技术问答>>正文


无此文件或目录?但该文件存在!

, , , ,

问题描述

我已经下载了一个游戏(Shank),但bin文件没有运行。我尝试启动可执行文件时显示的错误是:

bash: ./shank-linux-120720110-1-bin: No such file or directory

最佳解决方法

您可能试图在未安装32位支持的64位系统上运行32位二进制文​​件。

有三种情况你可以得到消息“没有这样的文件或目录”:

  • 该文件不存在。我认为你已经检查过该文件是否存在(可能是因为shell完成了它)。

  • 这个名字有一个文件,但它是一个悬挂的符号链接。

  • 该文件存在,您甚至可以读取它(例如,命令file shank-linux-120720110-1-bin显示“ELF 32位LSB可执行文件…”),但是当您尝试执行它时,您会被告知文件不存在。

在这最后一种情况下的错误信息无疑是令人困惑的。它告诉你的是缺少运行该程序所需的运行时环境的关键组件。不幸的是,通过错误报告的渠道只有错误代码的空间,而不是这些额外的信息,它真的是运行时环境的责任。如果您需要此解释的技术版本,请阅读Getting “Not found” message when running a 32-bit binary on a 64-bit system

file命令会告诉你这个二进制文件是什么。除少数例外情况外,您只能为Ubuntu发布的处理器体系结构运行二进制文件。主要的例外是,您可以在64位(amd64,a.k.a. x86_64)系统上运行32位(x86,a.k.a. IA32)二进制文件。

在Ubuntu到11.04之前,要在64位安装上运行32位二进制文​​件,您需要安装ia32-libs软件包。你可能需要安装额外的库(如果你这样做,你会得到一个明确的错误信息)。

64-bit,files,games,executable,ubuntu

由于11.10(oneiric)引入了multiarch支持,您仍可以安装ia32-libs,但您可以选择finer-grained方法,这足以获得libc6-i386(以及其他任何必需的库)。

64-bit,files,games,executable,ubuntu

次佳解决方法

64位Ubuntu Multiarch系统

只有在file file-name的输出显示时才按照这个答案,

file-name: ELF 32-bit LSB  executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.8, not stripped

要在64位multi-arch Ubuntu系统中运行32位可执行文件,必须添加i386架构,并且还必须安装libc6:i386libncurses5:i386libstdc++6:i386这三个库软件包。

sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install libc6:i386 libncurses5:i386 libstdc++6:i386
./file-name

第三种解决方法

通过安装32位的deb,我意识到我错过了一些库(除了ia32-libs和libc6)。我首先通过下面的命令解决了这个问题:

sudo apt-get install -f          

然后我得到另一个错误:

Message: SDL_GL_LoadLibrary 
Error: Failed loading libGL.so.1

显然,这些库已经正确安装。没有详细介绍,我不得不手动链接这些库。然后我意识到,通过Synaptic也可以更简单的解决方案安装以下软件包:

libgl1-mesa-glx:i386
libgl1-mesa-dri: i386.

之后,下一个问题是播放时出现黑屏,我通过用/http://treefort.icculus.org/smb/smb-linux-mesa-hotfix-test.tar.bz2替换/Shank /bin中的可执行文件解决了这个问题。

我希望这会对某人有用。如果您需要更多帮助或更多详情,请随时与我联系。

第四种方法

这里有一个成绩单,显示更多关于问题的性质,以及如何在Ubuntu 16.04中修复它。请注意,即使file报告了”dynamically linked”,ldd也会报告“不是动态可执行文件”。

$ ./myprogram
bash: myprogram: No such file or directory

$ file myprogram
myprogram: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.2.5, not stripped

$ ldd myprogram
    not a dynamic executable

一旦你安装libc6:i386,事情开始改善…

$ sudo apt-get install libc6:i386 # the initial fix
...

$ ldd myprogram
    linux-gate.so.1 =>  (0xf77fd000)
    libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xf7626000)
    /lib/ld-linux.so.2 (0x56578000)

$ ./myprogram
myprogram: error while loading shared libraries: libstdc++.so.6: cannot open shared object file: No such file or directory

要完成这项工作,您可能需要一次识别并安装一个附加的库……

$ sudo apt-get install libstdc++6:i386 ## may require various additional libs

$ ./myprogram
... works correctly ...

我不知道是否有系统的方法来确定要安装的正确库。有一些猜测将错误消息映射到软件包名称(选项卡完成帮助)。

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/410.html,未经允许,请勿转载。