Ainda não tem acesso? Estude com a gente! Matricule-se
Ainda não tem acesso? Estude com a gente! Matricule-se

Solucionado (ver solução)

Problema ao instalar tic80 no ubuntu

Prezados,

estou com alguns problemas ao tentar instalar o tic80 no ubuntu. Estou usando o ubuntu 14.04 64 bits. Assim, baixei o arquivo tic80_64bit_0.50.1.tar.gz no site do projeto.

Ao tentar executar pela primeira vez, me deparei com um erro de falta de bibliotecas, o que foi solucionado instalando da seguinte forma:

sudo apt-get install libsdl2-mixer-2.0-0 libsdl2-image-2.0-0 libsdl2-2.0-0

Porém, em seguida, ao tentar executar o tic80, é exibido um outro erro que ainda não consegui resolver (é possível perceber que a tela do programa inicia, porém ela apenas pisca e fecha, em seguida é exibido o erro no terminal):

user@computer:~/Downloads/tic80$ ./tic80 

 TIC-80 tiny computer 0.50.1
 http://tic.computer (C) 2017
./tic80: symbol lookup error: ./tic80: undefined symbol: SDL_QueueAudio

O mesmo erro ocorre quando executo o comando e passo como parâmetro um diretório ($ ./tic80 /tmp)

Alguém já passou por esta situação? O que devo fazer para prosseguir?

15 respostas

Olá Jefferson,

Pelo erro que está aparecendo parece que ainda tá faltando alguma lib. Tenta instalar o pacote de desenvolvimento da SDL pra ver se resolve:

sudo apt-get install libsdl2-dev

Faz o teste e avisa pra gente se resolve ou não o problema.

Jeferson,

instalei a biblioteca com o comando sugerido, porém continua o mesmo erro:

./tic80: symbol lookup error: ./tic80: undefined symbol: SDL_QueueAudio

Hmm, vamos então fazer o build do TIC-80 específico pra sua máquina. Tente as instruções abaixo:

sudo apt-get install git build-essential libgtk-3-dev libsdl2-dev lua5.3-dev zlib1g-dev
git clone https://github.com/nesbox/TIC-80
cd TIC-80
make linux

Depois é só tentar executar o TIC-80 na pasta bin. Vamos ver se funciona!

Jeferson,

não consegui baixar o lua5.3-dev, tentei executar com lua5.2 (5.2.3-1), porém dá erros:

$ make
linuxgcc `pkg-config --cflags gtk+-3.0` `sdl2-config --cflags` src/studio.c src/console.c src/run.c src/ext/file_dialog.c src/ext/md5.c src/ext/gif.c src/ext/net/SDLnet.c src/ext/net/SDLnetTCP.c src/ext/net/SDLnetselect.c src/fs.c src/tools.c src/start.c src/sprite.c src/map.c src/sfx.c src/music.c src/history.c src/world.c src/config.c src/keymap.c src/code.c src/dialog.c src/menu.c src/net.c src/surf.c src/ext/lpeg/*.c src/ext/gif/*.c src/html.c src/tic80.c src/tic.c src/ext/blip_buf.c src/jsapi.c src/luaapi.c src/ext/duktape/duktape.c -O3 -Wall -std=c99 -Iinclude/lua -Iinclude/zlib -Iinclude/gif -Iinclude/sdl2 -Iinclude/tic80 `pkg-config --libs gtk+-3.0` `sdl2-config --static-libs` -D_GNU_SOURCE -llua5.3 -ldl -lm -lpthread -lrt -lz -o bin/tic80
src/studio.c: In function ‘checkMousePos’:
src/studio.c:1064:2: warning: implicit declaration of function ‘SDL_PointInRect’ [-Wimplicit-function-declaration]
  return SDL_PointInRect(&studio.mouse.cursor, rect);
  ^
src/studio.c: In function ‘blitSound’:
src/studio.c:2077:3: warning: implicit declaration of function ‘SDL_QueueAudio’ [-Wimplicit-function-declaration]
   SDL_QueueAudio(studio.audio.device, studio.audio.cvt.buf, studio.audio.cvt.len_cvt);
   ^
src/studio.c: In function ‘onFSInitialized’:
src/studio.c:2641:14: error: ‘SDL_HINT_WINRT_HANDLE_BACK_BUTTON’ undeclared (first use in this function)
  SDL_SetHint(SDL_HINT_WINRT_HANDLE_BACK_BUTTON, "1");
              ^
src/studio.c:2641:14: note: each undeclared identifier is reported only once for each function it appears in
make: ** [linux] Erro 1

tentei instalar o lua 5.3.4 de acordo com o site, mas não consegui. Seguem comandos executados:

curl -R -O http://www.lua.org/ftp/lua-5.3.4.tar.gz
tar zxf lua-5.3.4.tar.gz
cd lua-5.3.4
make linux test

E o resultado:

$ make linux test
make: *** Sem regra para processar o alvo `linux'.  Pare.

Opa,

Vamos ter que investigar um pouco mais esse problema. Para tentar descobrir qual a lib que está faltando no momento da execução, entre na pasta onde você descompactou o tic80, execute o comando abaixo e depois poste aqui o resultado:

ldd ./tic80

Jeferson,

segue o resultado (link do gist porque o conteúdo foi maior que o suportado pelo forum da alura):

https://gist.github.com/jmsstudio/fcffc8e55ee1452e626ca0677f525c6d

Ok, o seu resultado ficou idêntico ao da minha máquina mas ainda precisamos ter certeza que a função SDL_QueueAudio existe na versão da SDL que está instalada na sua máquina. Para isso vou pedir para que você execute mais 2 comandos e informe aqui o resultado, por favor:

readelf -Ws /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 | grep SDL_QueueAudio

Esse vai procurar a função SDL_QueueAudio na lib que está no caminho informado.

O próximo comando é pra gente saber se as bibliotecas dinâmicas estão sendo buscadas em alguma outra pasta que não seja essa que foi informada pelo ldd:

echo $LD_LIBRARY_PATH

Esses problemas são mais difíceis mesmo de resolver mas vamos continuar explorando pra ver se a gente acha uma solução.

Jeferson,

seguem os resultados:

Ambos comandos não retornaram nada... Será que o problema pode estar aqui?

$ readelf -Ws /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 | grep SDL_QueueAudio

Verifiquei que o arquivo existe, mas no grep não teve resultado.

O segundo retornou uma linha em branco:

$ echo $LD_LIBRARY_PATH

Opa, acho que encontramos o culpado! O readelfdeveria tem encontrado essa função na libSDL mas aparentemente na versão que está instalada na sua máquina ainda não tinha essa função.

Acho que a gente pode tentar atualizar a versão da SDL na sua máquina mas antes preciso pesquisar pra ver como fazer isso.

Só pra gente ter uma ideia da versão, você pode rodar o comando abaixo:

dpkg -l | grep sdl

Na minha máquina, a versão instalada é a 2.0.4. Com o comando acima a gente consegue comparar enquanto a gente procura como atualizar a lib no Ubuntu 14.04.

Jeferson,

testei o mesmo procedimento em minha máquina do trabalho (que também é ubuntu 14.04 64 bits) e deu o mesmo resultado.

Assim, segue o resultado do comando com as versões de sdl instaladas:

$ dpkg -l | grep sdl
ii  libsdl-image1.2:amd64                                 1.2.12-5build2                                      amd64        Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-image1.2:i386                                  1.2.12-5build2                                      i386         Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-mixer1.2:i386                                  1.2.12-10                                           i386         Mixer library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-net1.2:i386                                    1.2.8-4                                             i386         Network library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-ttf2.0-0:i386                                  2.0.11-3                                            i386         TrueType Font library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl1.2debian:amd64                                 1.2.15-8ubuntu1.1                                   amd64        Simple DirectMedia Layer
ii  libsdl1.2debian:i386                                  1.2.15-8ubuntu1.1                                   i386         Simple DirectMedia Layer
ii  libsdl2-2.0-0:amd64                                   2.0.2+dfsg1-3ubuntu1.2                              amd64        Simple DirectMedia Layer
ii  libsdl2-image-2.0-0:amd64                             2.0.0+dfsg-3build2                                  amd64        Image loading library for Simple DirectMedia Layer 2, libraries
ii  libsdl2-mixer-2.0-0:amd64                             2.0.0+dfsg1-3                                       amd64        Mixer library for Simple DirectMedia Layer 2, libraries

Pelo visto, tem a libsdl 1.2 e a libsdl 2.0

É isso mesmo Jefferson, a SDL que está instalada em suas máquinas é uma versão mais antiga. Vamos precisar tentar compilar a última versão da SDL na sua máquina pra resolver o problema. Comece rodando os comandos:

sudo apt-get install build-essential xorg-dev libudev-dev libts-dev libgl1-mesa-dev libglu1-mesa-dev libasound2-dev libpulse-dev libopenal-dev libogg-dev libvorbis-dev libaudiofile-dev libpng12-dev libfreetype6-dev libusb-dev libdbus-1-dev zlib1g-dev libdirectfb-dev

Essas são as dependências da SDL. Depois vá até o link abaixo e baixe o source SDL2-2.0.7.tar.gz da SDL:

http://www.libsdl.org/download-2.0.php

Descompacte para algum lugar da sua máquina no terminal vá até essa pasta e digite os comandos abaixo:

./configure
make
sudo make install

Depois de fazer tudo isso, rode novamente o comando:

dpkg -l | grep sdl

Assim vamos ter certeza que atualizou. Se a versão mudar aí é só tentar rodar o TIC-80 novamente que agora deve funcionar.

Jeferson,

executei os passos conforme explicado, porém ao rodar o dpkg o resultado foi o mesmo do anterior:

$ dpkg -l | grep sdl
ii  libsdl-image1.2:amd64                                 1.2.12-5build2                                      amd64        Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-image1.2:i386                                  1.2.12-5build2                                      i386         Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-mixer1.2:i386                                  1.2.12-10                                           i386         Mixer library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-net1.2:i386                                    1.2.8-4                                             i386         Network library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-ttf2.0-0:i386                                  2.0.11-3                                            i386         TrueType Font library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl1.2debian:amd64                                 1.2.15-8ubuntu1.1                                   amd64        Simple DirectMedia Layer
ii  libsdl1.2debian:i386                                  1.2.15-8ubuntu1.1                                   i386         Simple DirectMedia Layer
ii  libsdl2-2.0-0:amd64                                   2.0.2+dfsg1-3ubuntu1.2                              amd64        Simple DirectMedia Layer
ii  libsdl2-image-2.0-0:amd64                             2.0.0+dfsg-3build2                                  amd64        Image loading library for Simple DirectMedia Layer 2, libraries
ii  libsdl2-mixer-2.0-0:amd64                             2.0.0+dfsg1-3                                       amd64        Mixer library for Simple DirectMedia Layer 2, libraries

E executando o tic80, deu também o mesmo resultado:

$ ./tic80 

 TIC-80 tiny computer 0.50.1
 http://tic.computer (C) 2017
./tic80: symbol lookup error: ./tic80: undefined symbol: SDL_QueueAudio

Parece que ele compilou a biblioteca com sucesso, mas não conseguiu substituir a que está instalada atualmente... dei uma pesquisada no google e não encontrei nada que falasse sobre isso.

Uma dúvida: eu consigo rodar o tic80 no docker? Se der, ficaria independente de particularidades de cada versão do SO.

solução

Acho que você pode tentar simplesmente copiar as libs que foram compiladas por cima das libs que estão na pasta: /usr/lib/x86_64-linux-gnu/

Você deve encontrar as libs compiladas na pasta onde você descompactou o código da SDL, mais especificamente na pasta lib ou bin. Em uma dessas pastas deve ter pelo menos um arquivo libSDL2-2.0.so.0. Aí é só copiar pra lá e testar novamente. Achei que o make install já fizesse isso mas parece que não.

Jeferson,

depois de todo esse trabalho, finalmente deu certo! Seguem os passos que foram executados:

Após executar os comandos ./configure , make e sudo make install, foi criado o diretório build e dentro dele, o diretório .libs. Dentro desse diretório .libs, copiei os arquivos libSDL2* para o diretório /usr/lib/x86_64-linux-gnu/.

Em outras palavras, o que eu fiz foi:

sudo cp ~/Downloads/SDL2-2.0.7/build/.libs/libSDL2* /usr/lib/x86_64-linux-gnu

Os arquivos que foram copiados foram:


libSDL2-2.0.so.0      libSDL2.la            libSDL2main.la        libSDL2_test.a
libSDL2-2.0.so.0.7.0  libSDL2.lai           libSDL2main.lai       libSDL2_test.la
libSDL2.a             libSDL2main.a         libSDL2.so            libSDL2_test.lai

Porém, ao executar o dpkg -l, não teve diferenças no resultado também:

$ dpkg -l | grep sdl
ii  libsdl-image1.2:amd64                                 1.2.12-5build2                                      amd64        Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-image1.2:i386                                  1.2.12-5build2                                      i386         Image loading library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-mixer1.2:i386                                  1.2.12-10                                           i386         Mixer library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-net1.2:i386                                    1.2.8-4                                             i386         Network library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl-ttf2.0-0:i386                                  2.0.11-3                                            i386         TrueType Font library for Simple DirectMedia Layer 1.2, libraries
ii  libsdl1.2debian:amd64                                 1.2.15-8ubuntu1.1                                   amd64        Simple DirectMedia Layer
ii  libsdl1.2debian:i386                                  1.2.15-8ubuntu1.1                                   i386         Simple DirectMedia Layer
ii  libsdl2-2.0-0:amd64                                   2.0.2+dfsg1-3ubuntu1.2                              amd64        Simple DirectMedia Layer
ii  libsdl2-image-2.0-0:amd64                             2.0.0+dfsg-3build2                                  amd64        Image loading library for Simple DirectMedia Layer 2, libraries
ii  libsdl2-mixer-2.0-0:amd64                             2.0.0+dfsg1-3                                       amd64        Mixer library for Simple DirectMedia Layer 2, libraries

Mesmo assim, entrei no diretório do tic80 e executei ./tic80 , para minha surpresa, a tela do programa apareceu!

Muito obrigado pela ajuda.

Que ótimo Jefferson!

Nós também agradecemos por você ter postado aqui os passos que você seguiu para resolver o problema, assim outros alunos que tiverem o mesmo problema já conseguem ter um guia.

Bom curso!