没有这个文件或目录?但是文件存在!

没有这个文件或目录?但是文件存在!

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

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

答案1

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

在三种情况下,您可能会收到“没有此文件或目录”消息:

  • 该文件不存在。我假设您已经检查过该文件是否存在(可能是因为 shell 完成了它)。
  • 有一个同名的文件,但它是一个悬空的符号链接。
  • 该文件存在,您甚至可以读取它(例如,命令file shank-linux-120720110-1-bin显示类似“ELF 32 位 LSB 可执行文件...”),但是当您尝试执行它时,您会被告知该文件不存在。

最后一种情况下的错误消息确实令人困惑。它告诉你的是,缺少运行程序所需的运行时环境的一个关键组件。不幸的是,报告错误的渠道只能容纳错误代码,而不能容纳这些额外的信息,而这些额外的信息实际上是运行时环境造成的。如果你想要这个解释的技术版本,请阅读在 64 位系统上运行 32 位二进制文​​件时出现“未找到”消息

file命令将告诉您这个二进制文件到底是什么。除了少数例外,您只能运行适用于您的 Ubuntu 版本的处理器架构的二进制文件。主要例外是您可以在 64 位(amd64,又名 x86_64)系统上运行 32 位(x86,又名 IA32)二进制文件。

在 Ubuntu 11.04 及以上版本中,要在 64 位安装上运行 32 位二进制文​​件,您需要安装ia32-libs包裹 安装 ia32-libs。您可能需要安装额外的库(如果这样做,您会收到一条明确的错误消息)。

自 11.10 (oneiric) 开始引入多架构支持,你仍然可以安装ia32-libs,但你可以选择更细粒度的方法,这足以获得libc6-i386 安装 libc6-i386(加上任何其他必要的库)。

答案2

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 位多架构 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

答案3

扩展@Gilles 的回答,至少有三种情况导致此错误:

  1. 该文件不存在。
  2. 该文件存在但是是一个悬空的符号链接。
  3. 文件存在(例如file命令有效),导致出现令人费解的错误消息。这可能意味着加载程序存在问题。

加载器问题类别:

  1. 可执行文件的加载程序不存在。您可以使用文件命令检查此情况,看看加载程序是否存在。例如

    file lmgrd
    lmgrd: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-lsb-x86-64.so.3, for GNU/Linux 2.6.18, stripped
    

    注意interpreter /lib64/ld-lsb-x86-64.so.3:如果此文件不存在,则需要安装它。对于 16.04 上的这个特定加载器,答案是sudo apt-get install lsb

  2. 脚本加载器的问题(见这个答案)。

  3. 缺少共享库 - 用于ldd <file-name>检查是否存在“未找到”的库。请参阅这个答案了解更多信息。

加载器不存在可能是由于 32/64 位不匹配或其他原因。可能还有其他我不知道的加载器错误。

答案4

通过安装 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.

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

我希望这对某些人有用。如果您需要更多帮助或更多详细信息,请随时联系我。

相关内容