Jump to content
Sign in to follow this  
Knitter

Compilar programa feito em C/C++ em OS X, problem com bibliotecas tipo ALUT e AL

Recommended Posts

Knitter

Boa noite,

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:

In file included from mOpenAL.framework/Headers/AL/alc.h:4:0,
                 from source/de/hackcraft/main.cpp:17:
mOpenAL.framework/Headers/AL/altypes.h:57:22: error: conflicting declaration 'typedef unsigned int ALsizei'
/System/Library/Frameworks/OpenAL.framework/Headers/al.h:74:13: error: 'ALsizei' has a previous declaration as 'typedef int ALsizei'
In file included from mOpenAL.framework/Headers/AL/alc.h:5:0,
                 from source/de/hackcraft/main.cpp:17:
mOpenAL.framework/Headers/AL/alctypes.h:58:22: error: conflicting declaration 'typedef unsigned int ALCsizei'

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?

Qualquer sugestão é bem-vinda.

Share this post


Link to post
Share on other sites
KTachyon

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.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Knitter

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.

Share this post


Link to post
Share on other sites
Knitter

Encontrei 3 versões diferentes do OpenAL no mesmo sistema e não faço ideia de onde vieram :D

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:

//...
ld: symbol(s) not found for architecture x86_64

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?

Share this post


Link to post
Share on other sites
Knitter

Resolvido, faltavam as bibliotecas Cocoa e OpenGL na lista de bibliotecas a juntar e tinham de estar antes da biblioteca SDLmain que precisava delas.

Share this post


Link to post
Share on other sites
KTachyon

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 :thumbsup:


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Share this post


Link to post
Share on other sites
Knitter

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.

Se não tivesse surgido o erro das duplas inclusões ainda estaria a tentar compilar isto.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.