没有相应的文件和目录? 但文件存在!

我已经下载了一个游戏(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可执行文件…”),但是当您尝试执行它时,你’重新告诉该文件不存在。

在最后一种情况下的错误消息无疑是令人困惑的。 它告诉你的是缺少运行程序所需的运行时环境的关键组件。 不幸的是,报告错误的通道只有错误代码的空间,而不是这个额外的信息,它确实是应该归咎于运行时环境。 如果您需要此解释的技术版本,请阅读在64位系统上运行32位二进制文​​件时获取“未找到”消息 。

file命令会告诉你这个二进制文件是什么。 除了少数例外,您只能为您的Ubuntu版本所用的处理器体系结构运行二进制文件。 主要的例外是您可以在64位(amd64,aka x86_64)系统上运行32位(x86,也称为IA32)二进制文件。

在高达11.04的Ubuntu中,要在64位安装上运行32位二进制文​​件,需要安装ia32-libs 安装ia32-libs 。 您可能需要安装其他库(如果您这样做,您将收到明确的错误消息)。

由于11.10(oneiric)引入了multiarch支持,你仍然可以安装ia32-libs ,但你可以选择更细粒度的方法,它足以获得libc6-i386 安装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位多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. 

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

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

这是一个成绩单,显示了更多关于问题的性质,以及如何解决它的Ubuntu 16.04。 请注意,即使file报告“动态链接”, 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 ... 

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

要扩展@Gilles答案,至少有三种情况会导致此错误:

  1. 该文件不存在。
  2. 该文件存在但是悬挂的符号链接。
  3. 该文件存在(例如file命令工作),使得一个令人费解的错误消息。 这可能意味着加载器存在问题。

装载机问题类别:

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

     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 检查任何“未找到”库。 有关详细信息,请参阅此答案 。

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