terça-feira, 19 de abril de 2011

Como resolver problemas de dependência entre pacotes na unha

A maioria das distribuições atuais voltadas ao usuário final possui gerenciadores de pacotes que resolvem sozinhos as dependências entre os mesmos, isto é, instalam, atualizam ou removem outros pacotes necessários para que algum outro funcione. Assim, instalar e remover programas, para o usuário final, é uma tarefa simples, já que o sistema faz todo o trabalho sujo.


Algumas vezes, porém, isso não é verdade, principalmente quando o usuário precisa instalar algum pacote genérico disponibilizado pelo desenvolvedor que não está nos repositórios da sua distro. Se o pacote é um rpm ou um deb genérico, por exemplo, ele pode ter sido desenvolvido tomando como base apenas o sistema o qual o desenvolvedor possui e este pode possuir alguns pacotes de bibliotecas que não estão presentes em outras distros que usam o mesmo sistema de pacotes.


Hoje, eu fui vítima de uma dessas casualidades ao tentar instalar um emulador do Z81 para testar o jogo Em Busca do Tesouro Perdido que, recentemente, teve seu código-fonte liberado pelo desenvolvedor. Acompanhe o procedimento de como resolver o problema das dependências:



O problema:


Ao iniciar o programa pela linha de comando, é exibida a seguinte mensagem:




andre@linux-big4:~> z81
z81: error while loading shared libraries: libvga.so.1: cannot open shared object file: No such file or directory


Isso significa que, enquanto o sistema estava carregando o programa, ele não encontrou uma biblioteca requerida para seu funcionamento, no caso, a libvga.so.1.


A solução: Descobrir as bibliotecas requeridas


Como este é um procedimento sequencial, o programa para sua execução na primeira biblioteca que ele não encontra, o que significa que, após instalar a tal biblioteca, o erro pode se repetir. Assim, vamos utilizar o comando ldd para descobrir quais as bibliotecas que o programa precisa para funcionar:




andre@linux-big4:~> whereis z81
z81: /usr/local/bin/z81 /usr/local/lib/z81
andre@linux-big4:~> ldd /usr/local/bin/z81
linux-gate.so.1 =>  (0xffffe000)
libvga.so.1 => not found
libc.so.6 => /lib/libc.so.6 (0xb75cc000)
/lib/ld-linux.so.2 (0xb774d000)


Como podemos ver, esta é a única biblioteca que não foi encontrada. Nisto, temos três soluções:


1. A biblioteca está instalada, mas com outro nome


Acontece muito quando se instala um pacote de uma distro na outra ou quando uma versão mais atual da biblioteca está instalada. Neste caso, crie um link simbólico, através do comando ln, apontando o arquivo que já existe para o nome que o programa está esperando e ele vai funcionar corretamente;


2. A biblioteca não está instalada


Neste caso, a primeira coisa a fazer é descobrir qual pacote instala a biblioteca. Uma pesquisa no Google - ou nas opções de seu gerenciador de pacotes - irá lhe ajudar. Em meu caso, eu descobri que o pacote é o svgalib. Caso exista este pacote nos repositórios de sua distro, basta instalá-lo e problema resolvido;


3. O pacote com a biblioteca não está nos repositórios de minha distro


Infelizmente, este foi o meu caso. Neste caso, você pode tentar instalar um pacote do mesmo tipo mas de outra distro ou simplesmente compilar o código-fonte da mesma.


Após essas dicas, seu programa vai funcionar corretamente.


Nota: em meu caso, infelizmente, não funcionou: ao executá-lo no ambiente gráfico, eu ficava com uma tela com apenas um cursor no canto e, no console, como se tudo estivesse congelado. Depois, li no manual que o programa tem problemas com monitores de alta resolução. É, fazer o quê? Procurar outro emulador...


Nota 2: Acabei de descobrir que o emulador também instala uma versão para o xorg. Diversão garantida!

Nenhum comentário:

Postar um comentário