Данный файл или каталог отсутствует? Но файл существует!

Я загрузил игру (Shank), но файл bin не запускается. Ошибка, которая появляется при попытке запуска исполняемого файла:

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

Вероятно, вы пытаетесь запустить 32-битный двоичный код в 64-разрядной системе, в которой не установлена ​​32-разрядная поддержка.

Есть три случая, когда вы можете получить сообщение «Нет такого файла или каталога»:

  • Файл не существует. Я предполагаю, что вы проверили, что файл существует (возможно, потому, что оболочка завершает его).
  • Существует файл с этим именем, но это болтливая символическая ссылка.
  • Файл существует, и вы даже можете его прочитать (например, командный file shank-linux-120720110-1-bin отображает что-то вроде «ELF 32-bit LSB executable …»), и все же, когда вы пытаетесь его выполнить, re сказал, что файл не существует.

Сообщение об ошибке в этом последнем случае, по общему признанию, запутывает. Это говорит о том, что ключевой компонент среды выполнения, необходимый для запуска программы, отсутствует. К сожалению, канал, через который сообщается об ошибке, имеет место только для кода ошибки, а не для этой дополнительной информации, что это действительно среда выполнения, которая виновата. Если вы хотите получить техническую версию этого объяснения, прочитайте сообщение «Не найдено» при запуске 32-разрядного двоичного файла в 64-разрядной системе .

Команда file сообщит вам, что это за двоичный файл. За некоторыми исключениями вы можете запускать только двоичный код для архитектуры процессора, для которого предназначен выпуск Ubuntu. Основное исключение состоит в том, что вы можете запускать 32-разрядные (x86, aka IA32) двоичные файлы в 64-разрядных (amd64, aka x86_64) системах.

В Ubuntu до 11.04 для запуска 32-битного двоичного ia32-libs при 64-разрядной установке вам необходимо установить пакет ia32-libs Установите ia32-libs , Возможно, вам придется установить дополнительные библиотеки (при этом вы получите явное сообщение об ошибке).

Начиная с 11.10 (oneiric) реализована поддержка многократного использования , вы все равно можете установить 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 

Чтобы запустить 32-битный исполняемый файл в 64-битной многоэлементной системе Ubuntu, вам нужно добавить архитектуру 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 

Установив deb для 32 бит, я понял, что мне не хватает некоторых библиотек (в дополнение к 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 ... 

Я не знаю, существует ли систематический способ определения правильных библиотек для установки. Существует немного догадок, сопоставляющих сообщения об ошибках с именами пакетов (помощь по завершению табуляции).