Na questão do AskUbuntu, o autor sabia qual dependência estava faltando porque ele estava tentando instalar um aplicativo de 32 bits em uma instalação do Ubuntu de 64 bits e, para citá-lo:
algumas bibliotecas de 32 bits estão ausentes no Ubuntu de 64 bits.
Então ele precisava instalá-los.
No entanto, para responder às suas perguntas:
- Como detectar dependências ausentes para um executável?
- Existe uma maneira genérica de procurar a lista de dependências de um arquivo executável e quais estão faltando?
Sim, existe uma maneira de detectar dependências ausentes ou obter uma lista delas.
Detectar dependências ausentes:
O sistema de gerenciamento de pacotes apt
, usado nas distribuições Linux baseadas no Debian, é um sistema inteligente, onde detectará automaticamente se os pacotes atualmente instalados têm dependências ausentes (mesmo se você os instalou usando dpkg
e não apt-get
). Digamos que você tenha instalado um pacote, sem suas dependências, da próxima vez que executar apt-get upgrade
, você receberá um erro semelhante a este:
The following packages have unmet dependencies:
package1 : Depends: package2 (>= 1.8) but 1.7.5-1ubuntu1 is to be installed
A indicação de que package1
depende de package2
e package2
(ou seja, a versão mais recente neste exemplo) não está instalada. Geralmente, para corrigir isso, você executa o comando sudo apt-get install -f
, que instrui apt-get
a tentar recuperar e instalar os pacotes ausentes.
Procure a lista de dependências de um executável:
O pacote apt
, bem como dpkg
, fornece uma maneira simples de listar as dependências de um pacote.
-
Para
apt
, o comando é:apt-cache depends <packagename>
Isto irá verificar o pacote nos repositórios e listar as dependências, assim como os pacotes "sugeridos". Se você realmente quiser filtrar apenas as dependências, poderá filtrar a saída fazendo isso:
apt-cache depends <packagename> | grep Depends
. Aqui está um exemplo de saída:alaa@aa-lu:~$ apt-cache depends vlc vlc Depends: fonts-freefont-ttf Depends: vlc-nox |Depends: libavutil51 Depends: libxpm4 Depends: zlib1g PreDepends: dpkg Suggests: videolan-doc Recommends: vlc-plugin-notify Recommends: xdg-utils Breaks: vlc-data Breaks: vlc-nox Replaces: vlc-data Replaces: vlc-nox
A saída é reduzida para brevidade.
-
Para
dpkg
, o comando para executá-lo em um arquivo local é:dpkg -I file.deb | grep Depends
dpkg -I file.deb
retorna muitas informações sobre esse arquivo.deb
, então filtramos para ver apenas as dependências.
Como apt
é na verdade apenas um front-end para o dpkg , ambos os comandos essencialmente fazem a mesma coisa , eles vão olhar o arquivo .deb
do aplicativo para descobrir quais dependências ele precisa, exceto apt-cache
irá procurar nos repositórios. Estas "dependências" são listadas dentro do arquivo .deb
como metadados, é por isso que mesmo que você tenha baixado e instalado manualmente um aplicativo (que geralmente é um arquivo .deb
, você será instalando-o usando dpkg
e não apt
) de um site (por exemplo, o navegador Chrome do Google do site do Google), apt
ainda vai descobrir que existem dependências ausentes, analisando os pacotes instalados.
Eu não sou bem versado com todo esse material de arquitetura de computadores, mas no caso de Java nessa questão, é realmente sobre a arquitetura de 32 e 64 bits. Para citar a resposta do stackoverflow:
Você está executando em um sistema de 64 bits sem um ambiente de tempo de execução de 32 bits.
Essa biblioteca específica, que precisava ser instalada, não foi incluída na parte "Dependências" do pacote de instalação, porque ele estava instalando um aplicativo de 32 bits em um sistema de 64 bits. Portanto, foi necessária uma solução de problemas extra para encontrar o culpado, daí o uso de readelf
e ldd
. No entanto, elas provavelmente são mais específicas para bibliotecas e lembre-se de que "dependências" nem sempre são "bibliotecas", mas podem ser outras aplicações. Então, " esta é a melhor abordagem? ", duvido; Acho que só é melhor quando é necessário solucionar problemas extra.