问题描述
我已经下载了一个游戏(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
软件包。你可能需要安装额外的库(如果你这样做,你会得到一个明确的错误信息)。
由于11.10(oneiric)引入了multiarch支持,您仍可以安装ia32-libs
,但您可以选择finer-grained方法,这足以获得libc6-i386
(以及其他任何必需的库)。
次佳解决方法
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:i386
,libncurses5:i386
,libstdc++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 ...
我不知道是否有系统的方法来确定要安装的正确库。有一些猜测将错误消息映射到软件包名称(选项卡完成帮助)。