Compilar programa feito em C/C++ em OS X, problem com bibliotecas tipo ALUT e AL - MacOS - Portugal-a-Programar
By Knitter, July 13, 2011 in MacOS
Embora use OS X todos os dias não tenho por hábito compilar software feito em C ou C++, para piorar, a utilização que sempre fiz de C nunca me levou a necessitar grandes configurações de bibliotecas externas às disponíveis nas ferramentas de compilação pelo que estou completamente perdido no meio do que estou a tentar fazer.
Quero compilar o jogo Linwarrior, http://hackcraft.de/games/linwarrior_3d/, no meu sistema, um OS X 10.6.8 e estou a encontrar barreiras a cada curva que dou. O primeiro problema começou com o facto do código do LW algumas flags na compilação que a versão do GCC que a Apple fornece não suporta, nomeadamente o valor "c++0x" para a flag "std". Instalei o GCC através do macports e estou a referenciar a versão do compilador para c++ directamente, estou a usar o 4.5.3.
Segundo problema, e parece que os restantes também, está relacionado com a biblioteca AL, ou OpenAL no caso do OS X, que é o que tenho instalado e com o facto de no código se referenciar esta biblioteca sempre através do include <AL/al.h> que em OS X não está correcto. Contornei isto colocando alguns links simbólicos para reproduzir a estrutura.
Depois vieram problemas com o próprio código da biblioteca e com o uso de código que nesta versão do compilador é inválido. Resolvi isto alterando o código para remover a parte problemática (uso de ALvoid em vez de void, por exemplo).
Além disto o biblioteca AL para OS X tem um header, o alut.h, que não tem uma única macro das necessárias e não tem quase nenhuma função. Instalei a biblioteca ALUT, meti mais uns links e contornei este problema. No fim, deparo-me com erros do tipo:
E continuo sem conseguir compilar o raio do jogo e sem conseguir resolver os problemas, e todos estes problemas parecem demasiado para serem normais, não sei que raio se passa para estar a dar tanta confusão e não sei se não terei algum problema e não estarei a usar isto de forma errada.
Se quiserem ver uma descrição mais pormenorizada do que já fiz e dos problemas que tive, caso estejam para aí virados, o tópico original é http://forum.freegamedev.net/viewtopic.php?f=52&t=1583 , tenho também um zip com o código e com as bibliotecas em http://dl.dropbox.com/u/4905348/linwarrior-martelado.zip
O que gostaria de saber é se alguém tem experiência em compilar software usando estas bibliotecas, onde é que as costuma ir buscar e, se tendo experiência, estes problemas são normais ou esperados e se assim for que raio estou eu a fazer de tão errado?
Eu, o que vejo é teres duas definições de um tipo em locais diferentes do código. Penso que estás a importar duas frameworks do OpenAL, uma na pasta comum das frameworks (OpenAL) e outra na pasta do projecto (mOpenAL). Tenta remover a OpenAL e vê o que acontece.
WOW! Realmente escapou-me completamente aquele caminho enorme para a framework global... aquilo nem devia estar ali mas não sei como não reparei logo nisso. Vou tentar remover a chamada a essa framework.
De qualquer forma, no meio de tantas alterações já não confio no que tenho instalado, se conseguir compilar isto tenho de rever a instalação das bibliotecas para ver se o processo fica mais simples.
Encontrei 3 versões diferentes do OpenAL no mesmo sistema e não faço ideia de onde vieram
Depois de corrigir o erro das duas importações surgiram mais uma data de erros em código que não faziam qualquer sentido, dado que andei a mexer no sistema e já tinha mais links simbólicos espalhados do que o que gostava resolvi começar do zero e olhar para isto com outra atenção. Removi as bibliotecas que estavam a mais, confirmei as versões para ver se estão actualizadas e alterei o código para incluir algumas condições de pré-processamento para incluir os headers de acordo com o sistema, em vez de incluir <AL/al.h>, se passar uma flag passa a incluir com <OpenAL/al.h>.
A partir deste momento a compilação é feita com sucesso mas a parte de linkagem resulta em erro:
Coloquei a mensagem completa no pastebin, http://paste.portugal-a-programar.org/pastebin.php?show=4027
Confirmei a biblioteca SDLmain e é uma biblioteca universal com as duas arquitecturas, i386 e x64. Fiz o mesmo para as restantes bibliotecas e todas têm a aquitectura x86_64. Há alguma forma de confirmar quais as bibliotecas que são linkadas para ver se não estarão a ser obtidas outras?
Ou alguma forma de forçar a utilização de x86_64?
Resolvido, faltavam as bibliotecas Cocoa e OpenGL na lista de bibliotecas a juntar e tinham de estar antes da biblioteca SDLmain que precisava delas.
Bem... estou a ver que a história se desenvolveu bem. Por acaso pelo que postaste no pastebin, provavelmente não chegaria lá se tivesse que resolver, mas a falta dessas bibliotecas seriam sempre uma possibilidade que me passaria pela cabeça (visto que o SDL precisa efectivamente do OpenGL para correr).
Fico contente que tudo tenha corrido bem
História é mesmo o termo. Nunca imaginei que ter um conjunto de bibliotecas com configuração dúbia causasse tanto problema. O que me atirou completamente para fora é que, estando o sistema mal configurado, as "soluções" que fui encontrando foram dando resultados que pareciam estar no caminho certo.