Foros - Stratos

Programadores => General Programadores => Mensaje iniciado por: _CONEJO en 11 de Agosto de 2009, 09:24:49 PM

Título: Compilar para distintas plataformas (C++)
Publicado por: _CONEJO en 11 de Agosto de 2009, 09:24:49 PM
Hola,

Tengo un desarrollo para múltiples plataformas (PC, Wii,...) El problema es que me gustaría saber cómo puedo hacer para compilar para una u otra plataforma de manera sencilla. En mi proyecto tengo una "capa de abstracción" para gráficos/sonido/input de tal manera que de cara al juego son las mismas funciones (por ejemplo Control.A Sonido.start() ....) Luego, en cada clase correspondiente ya lo manejo de forma diferente según sea la plataforma. Hasta ahora lo he ido haciendo "a mano" comentando las lineas correspondientes. Pero puede ser un engorro tener que modificar mil líneas en diferentes archivos.

No estoy seguro, pero imagino que se podrá hacer algo, pero no sé exactamente qué, ni como buscarlo (al menos, hasta ahora, no he tenido éxito).


Saludos
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: flipper83 en 11 de Agosto de 2009, 10:53:47 PM
si utilizas visual estudio puedes definir etiquetas de preprocesado.
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: fjfnaranjo en 11 de Agosto de 2009, 11:30:10 PM
Preprocesador +1

codewarrior powa!
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: _CONEJO en 12 de Agosto de 2009, 12:06:58 AM
pues programo en eclipse sobre linux ...
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: flipper83 en 12 de Agosto de 2009, 07:42:54 AM
es más jodido pero puedes hacerlo con tareas de ant q preprocessen tu código, esto lo se porq lo he hecho, pero estoy seguro q existe por ahí algún preprocesador para eclipse.

No se si sabes bien como funciona el preproceso.
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: _CONEJO en 12 de Agosto de 2009, 08:12:44 AM
El uso del preprocesador lo sé en teoría, nunca me ha dado por usarlo específicamente (fuera de includes y defines).

Imagino que será algo así

Código (cpp) [Seleccionar]
#ifdef WINDOWS
    ... /* Windows specific code */
#elif defined(UNIX)
    ... /* Unix specific code */
#else
    #error "What's your operating system?"
#endif


El problema es donde definir "WINDOWS", "UNIX",... en el makefile?
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: Prompt en 12 de Agosto de 2009, 10:08:48 AM
Cita de: _CONEJO en 12 de Agosto de 2009, 08:12:44 AM

El problema es donde definir "WINDOWS", "UNIX",... en el makefile?


Viene definido en el compilador / headers del mismo de las diferentes plataformas.
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: _CONEJO en 12 de Agosto de 2009, 10:14:06 AM
¿Alguna forma de saber cual es el que está definido en determinado compilador? Poruqe ni idea de cual será el de Wii/DS ...


*Si, parezco/soy tonto, lo mio es un poco más de IA y programación más teórica que de práctica... jajaja
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: Prompt en 12 de Agosto de 2009, 01:37:45 PM
Pues en Wii y DS no tengo la más remota idea, habrá que mirar la documentación no?
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: Warchief en 13 de Agosto de 2009, 12:24:08 AM
Son definiciones para el preprocesador que se ponen por configuración y plataforma (creo que en Makefiles es lo que se llama target).

Lo que se le indica al compilador es la plataforma de destino. ¿Qué compilador usas para Wii y DS? ¿gcc? Que no tiene necesariamente que ver con el código para cada plataforma. De hecho mucho del código es compartido (todo excepto el que implica llamadas al sistema operativo y al sdk concretos).

Por ejemplo, si tenemos un proyecto con estos ficheros:
render.win32.cpp  // render específico para win
render.mac.cpp // render específico para mac
render.h // interfaz para el render
program.cpp // programa común que usa el render

Tendrás que tener dos configuraciones, o proyectos, uno para compilar para windows y otro para mac. En eclipse + linux no sé si tienes que crear dos proyectos o puedes configurar mediante GUI o tocar el makefile a mano.

Puedes hacerlo incluyendo sólo los ficheros que necesitas o bien mediante las directivas del preprocesador:
#if defined( PLATFORM_WIN )
#    include "render.win32.cpp"
#elif defined( PLATFORM_MAC )
#    include "render.mac.cpp"
#else
#    error "Platform not defined"
#endif
En un fichero adicional render.cpp con sólo ese código, y añadiendo el fichero render.cpp al proyecto.

@Prompt
¿Qué quieres decir con que viene en el compilador / headers?
Si te refieres al Platform SDK, puede hacer uso de algunas internas, pero no son las que tienes que usar el programa. Por ejemplo, <windows.h> en Windows tiene varias definiciones, pero no puedes hacer include de ese fichero si no estás en windows. Tienes que usar las tuyas propias para saber si tienes que incluir <windows.h> o no; y esas tuyas propias se definen en el target del makefile (en el caso de entornos visuales mediante el GUI).
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: Warchief en 13 de Agosto de 2009, 12:26:29 AM
SI usas gcc, en la línea de comandos es la opción -D

Ejemplo: gcc -DPLATFORM_WIN
Define PLATFORM_WIN.


Link de ayuda:
http://www.ccs.neu.edu/home/sbratus/cpp/make-help.txt
Título: Re: Compilar para distintas plataformas (C++)
Publicado por: _CONEJO en 13 de Agosto de 2009, 08:10:28 AM
Genial, muchas gracias