Как обнаружить отсутствующие зависимости для исполняемого файла?
Глядя на /questions/598863/net-takogo-fajla-ili-kataloga-pri-vyizove-java/598866#598866 как автор узнал, какая зависимость отсутствовала? Есть ли общий способ поиска списка зависимостей исполняемых файлов и какие из них отсутствуют?
ОБНОВЛЕНИЕ: я только заметил, что заметил, что https://stackoverflow.com/a/9082947/14731 использовал
readelf -l [исполняемый файл]
Это лучший подход?
1 ответ
В связанном вопросе AskUbuntu автор знал, какая зависимость отсутствовала, потому что он пытался установить 32-разрядное приложение на 64-разрядную установку Ubuntu, и, процитировав его:
в 64-битной Ubuntu отсутствуют некоторые 32-битные библиотеки.
Поэтому ему нужно было их установить.
Однако, чтобы ответить на ваши вопросы:
- Как обнаружить отсутствующие зависимости для исполняемого файла?
- Есть ли общий способ поиска списка зависимостей исполняемых файлов и какие из них отсутствуют?
Да, есть способ обнаружить отсутствующие зависимости или получить их список.
Обнаружить отсутствующие зависимости:
Система управления пакетами apt
Используется в дистрибутивах Linux на основе Debian. Это умная система, в которой она автоматически обнаружит, что в установленных пакетах отсутствуют зависимости (даже если вы установили их с помощью dpkg
, и не apt-get
). Допустим, вы установили пакет без его зависимостей, а затем в следующий раз выполните apt-get upgrade
вы получите ошибку, похожую на эту:
The following packages have unmet dependencies:
package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed
Указывая, что package1
зависит от package2
, а также package2
(а именно, более новая версия в этом примере) не установлена. Обычно, чтобы это исправить, вы выполняете команду sudo apt-get install -f
, который инструктирует apt-get
попытаться получить и установить недостающие пакеты.
Посмотрите список зависимостей исполняемого файла:
apt
люкс, а также dpkg
, обеспечивает удобный способ перечисления зависимостей пакета.
За
apt
команда выглядит так:apt-cache depends <packagename>
Это проверит пакет в репозиториях и выведет список зависимостей, а также "предложенных" пакетов. Если вы действительно хотите отфильтровать зависимости самостоятельно, вы можете отфильтровать вывод, выполнив это:
apt-cache depends <packagename> | grep Depends
, Вот пример вывода:alaa @ aa-lu: ~ $ apt-cache зависит от vlc VLC Зависит от: fonts-freefont-ttf Зависит: vlc-nox | Зависит от: libavutil51 Зависит от: libxpm4 Зависит от: zlib1g PreDepends: dpkg Предлагает: videolan-doc Рекомендует: vlc-plugin-notify Рекомендует: xdg-utils Перерывы: vlc-data Перерывы: vlc-nox Заменяет: vlc-data Заменяет: vlc-nox
Вывод урезан для краткости.
За
dpkg
команда для его запуска в локальном файле:dpkg -I file.deb | grep Depends
dpkg -I file.deb
возвращает много информации об этом.deb
файл, поэтому мы фильтруем его, чтобы посмотреть только на зависимости.
поскольку apt
на самом деле это просто интерфейс для dpkg, обе эти команды, по сути, делают одно и то же, они идут посмотреть .deb
файл приложения, чтобы узнать, какие зависимости ему нужны, кроме apt-cache
поищу в репозиториях. Эти "зависимости" перечислены внутри .deb
файл как метаданные, поэтому даже если вы вручную загрузили и установили приложение (которое обычно .deb
файл, так что вы будете устанавливать его с помощью dpkg
и не apt
) с веб-сайта (например, браузер Google Chrome с веб-сайта Google), apt
все равно узнает, что отсутствуют зависимости, проанализировав установленные пакеты.
Я не очень разбираюсь во всем этом, что касается компьютерной архитектуры, но в случае с Java в этом вопросе речь идет о 32- и 64-битной архитектуре. Чтобы процитировать ответ от stackoverflow:
Вы работаете в 64-битной системе без 32-битной среды выполнения.
Эта конкретная библиотека, которую нужно было установить, не была включена в часть "Зависит" пакета установки, поскольку он устанавливал 32-разрядное приложение в 64-разрядной системе. Таким образом, для поиска виновника потребовалось дополнительное устранение неполадок, следовательно, использование readelf
а также ldd
, Однако они, вероятно, более специфичны для библиотек и помнят, что "зависимости" не всегда являются "библиотеками", но могут быть и другими приложениями. Так что "это лучший подход?", Я сомневаюсь в этом; Я думаю, что это лучше всего, когда требуется дополнительное устранение неполадок.