[PS2-SDL] Comando para compilar y crear elf de un archivo C

Bueno la cuestión es que instalé el ps2toolchain + ps2sdk + ports en debian 9, y quería configurar el Geany (IDE) para que compile y cree el elf de un archivo de código fuente de C.

En compile tengo esto y aparentemente funciona crea el .o
ee-gcc -Wall -c -I/usr/local/ps2dev/ps2sdk/ports/include/SDL "%f"

mis máximas dudas vienen en el build, en el cual tengo
ee-gcc -Wall -o -I/usr/local/ps2dev/ps2sdk/ports/lib/lib -L/usr/local/ps2dev/ps2sdk/ports/lib/ -L/usr/local/ps2dev/ps2sdk/ports/lib -L/usr/lib/ps2dev/gsKit/lib "%e" -lsdlmain -lsdl -lgskit -lcdvd -lmf -lps2ip  "%f"
y no funciona suelta esto ==>
ee-gcc -Wall -o -I/usr/local/ps2dev/ps2sdk/ports/lib/lib -L/usr/local/ps2dev/ps2sdk/ports/lib/ -L/usr/local/ps2dev/ps2sdk/ports/lib -L/usr/lib/ps2dev/gsKit/lib "prueba" -lsdlmain -lsdl -lgskit -lcdvd -lmf -lps2ip  "prueba.c" (en el directorio: /home/snake/Documentos)
prueba.c:2:17: SDL.h: No existe el fichero o el directorio
prueba.c: En la función `main':
prueba.c:5: aviso: declaración implícita de la función `SDL_Init'
prueba.c:5: `SDL_INIT_AUDIO' no ha sido declarado aquí (primero úselo en esta función)
prueba.c:5: (Cada identificador no declarado solamente se reporta una vez
prueba.c:5: para cada funcion en la que aparece.)
prueba.c:5: `SDL_INIT_VIDEO' no ha sido declarado aquí (primero úselo en esta función)
prueba.c:6: aviso: declaración implícita de la función `printf'
prueba.c:6: aviso: declaración implícita de la función `SDL_GetError'
prueba.c:6: aviso: el argumento de formato no es un apuntador (argumento 2)
prueba.c:9: `SDL_Quit' no ha sido declarado aquí (primero úselo en esta función)
Ha fallado la compilación.


Y mi código es bien simple ==>
#include <stdlib.h>
#include "SDL.h"

int main (int argc, char** argv ) {
   if(SDL_Init(SDL_INIT_AUDIO|SDL_INIT_VIDEO)<0){
         printf("No se puede inicializar SDL: %s\n", SDL_GetError());
         exit(1);
      }
   atexit(SDL_Quit);
   return 0;
}


Gracias por vuestro tiempo.
Desconozco el sistema de build en PS2, pero el compilador parece que te falla por no encontrar SDL.h en el #include. Deberás indicarle al compilador dónde se encuentra ese fichero, que posiblemente por lo que pones estará en /usr/local/ps2dev/ps2sdk/ports/include/SDL

Un saludo.
Charlie52 escribió:Desconozco el sistema de build en PS2, pero el compilador parece que te falla por no encontrar SDL.h en el #include. Deberás indicarle al compilador dónde se encuentra ese fichero, que posiblemente por lo que pones estará en /usr/local/ps2dev/ps2sdk/ports/include/SDL

Un saludo.


Muchas gracias por tu respuesta.
Lo arreglé así:
Compile ==>
ee-gcc -c -I/usr/local/ps2dev/ps2sdk/ports/include/SDL "%f"

Build ==>
ee-gcc -Wall -static -o  "%e"  "%f" -lsdlmain -lsdl -lgskit -lcdvd -lmf -lps2ip  -L/usr/local/ps2dev/ps2sdk/ports/lib -L/usr/local/ps2dev/ps2sdk/ports/lib/ -L/usr/lib/ps2dev/gsKit/lib


y exportando las variables en ~/.profile así:

export PS2DEV=/usr/lib/ps2dev
export PS2SDK=$PS2DEV/ps2sdk
export GSKIT=$PS2DEV/gsKit
export SDL=/usr/local/ps2dev/ps2sdk/ports/include/SDL
export PATH=$PATH:$PROGRAMFILES/Git/bin
export PATH=$PATH:$PROGRAMFILES/Mercurial
export PATH=$PATH:$PS2DEV/bin
export PATH=$PATH:$PS2DEV/ee/bin
export PATH=$PATH:$PS2DEV/iop/bin
export PATH=$PATH:$PS2DEV/dvp/bin
export PATH=$PATH:$PS2SDK/bin
export PATH=$PATH:/usr/local/ps2dev/ps2sdk/ports/include
export CPATH="/usr/local/ps2dev/ps2sdk/ports/include:/usr/lib/ps2dev/ps2sdk/port$


Ahora el problema es que no doy ejecutado el ejecutable que me genera. ¿alguien se imagina porqué?
Es un ejemplo sencillo donde cargo un bmp y lo muestro.
Ya te digo que estoy un poco a ciegas en PS2, pero estaba leyendo este Makefile https://github.com/ps2dev/ps2sdk-ports/ ... t/Makefile con ejemplos que usa SDL y compila para tener un .elf. Si quieres prueba estos comandos desde la propia línea de comandos donde tengas el prueba.c y luego lo adaptas a tu IDE y a tus variables del entorno. No sea que te este poniendo el fichero en algún otro sitio...

ee-gcc -D_EE -G0 -I/usr/lib/ps2dev/ps2sdk/ee/include -I/usr/lib/ps2dev/ps2sdk/common/include -I/usr/local/ps2dev/ps2sdk/ports/include/SDL -c prueba.c -o prueba.o

ee-gcc: el compilador
-D_EE: el macro _EE que por ejemplo usa SDL para saber que la plataforma es little endian https://github.com/ps2dev/ps2sdk-ports/ ... rder.h#L49
-G0: Sin información para el debugger. La verdad es que no sé cómo será la depuración en PS2.
-I/usr/lib/ps2dev/ps2sdk/ee/include: headers que seguramente use SDL y de la librería C como stdlib.h de tu ejemplo
-I/usr/lib/ps2dev/ps2sdk/common/include: lo mismo
-I/usr/local/ps2dev/ps2sdk/ports/include/SDL: para poder usar SDL.h
-c: indica que solo quieres compilar, no linkear
prueba.c: el fichero C de tu código
-o: salida
prueba.o: el fichero object

Esa era la fase de compilación, es posible que a lo mejor te da algún error si yo me he equivocado en algo...

ee-gcc -mno-crt0 -T/usr/lib/ps2dev/ps2sdk/ee/startup/linkfile -nostartfiles -L/usr/lib/ps2dev/ps2sdk/ee/lib -o prueba.elf /usr/lib/ps2dev/ps2sdk/ee/startup/crt0.o prueba.o -lc -L/usr/lib/ps2dev/gsKit/lib -L/usr/local/ps2dev/ps2sdk/ports/lib -lsdl -lcdvd

ee-gcc: el compilador aunque ahora hace de linker
-mno-crt0: No linkea nada en el crt0.o
-T/usr/lib/ps2dev/ps2sdk/ee/startup/linkfile: el script que linkea para crt0
-nostartfiles: no utilizar el crt0 del sistema, hay que dar uno propio de ps2sdk
-L/usr/lib/ps2dev/ps2sdk/ee/lib: aquí debería estar libc.a para poder linkear con la librería C del propio ps2sdk
-o: salida
prueba.elf: tu fichero ELF
/usr/lib/ps2dev/ps2sdk/ee/startup/crt0.o: linkea con el crt0 del propio ps2sdk
prueba.o: linkea con tu fichero object que anteriormente hemos compilado
-lc: linkea el libc.a
-L/usr/lib/ps2dev/gsKit/lib: no entiendo por qué especifica este directorio si luego no linkea nada con libgskit.a ¿A lo mejor lo puedes quitar sin problemas?
-L/usr/local/ps2dev/ps2sdk/ports/lib: el directorio donde tendrías que tener libsdl.a
-lsdl: linkea la librería libsdl.a
-lcdvd: aquí también tengo mis dudas de si es necesario linkear con libcdvd.a. Posiblemente me equivoque pero parece que SDL se compila incluyendo ya dentro de libsdl.a todas las librerías necesarias como libcdvd.a y libgskit.a ¿Por eso a lo mejor tampoco hay que especificar -lgskit?

A lo mejor falla en algo, pero creo que te puede servir como base para crear tu propio comando para compilar y crear el fichero ELF en el mismo directorio donde tengas el prueba.c, así descartas otros errores del IDE.

Un saludo!
Charlie52 escribió:Ya te digo que estoy un poco a ciegas en PS2, pero estaba leyendo este Makefile https://github.com/ps2dev/ps2sdk-ports/ ... t/Makefile con ejemplos que usa SDL y compila para tener un .elf. Si quieres prueba estos comandos desde la propia línea de comandos donde tengas el prueba.c y luego lo adaptas a tu IDE y a tus variables del entorno. No sea que te este poniendo el fichero en algún otro sitio...

ee-gcc -D_EE -G0 -I/usr/lib/ps2dev/ps2sdk/ee/include -I/usr/lib/ps2dev/ps2sdk/common/include -I/usr/local/ps2dev/ps2sdk/ports/include/SDL -c prueba.c -o prueba.o

ee-gcc: el compilador
-D_EE: el macro _EE que por ejemplo usa SDL para saber que la plataforma es little endian https://github.com/ps2dev/ps2sdk-ports/ ... rder.h#L49
-G0: Sin información para el debugger. La verdad es que no sé cómo será la depuración en PS2.
-I/usr/lib/ps2dev/ps2sdk/ee/include: headers que seguramente use SDL y de la librería C como stdlib.h de tu ejemplo
-I/usr/lib/ps2dev/ps2sdk/common/include: lo mismo
-I/usr/local/ps2dev/ps2sdk/ports/include/SDL: para poder usar SDL.h
-c: indica que solo quieres compilar, no linkear
prueba.c: el fichero C de tu código
-o: salida
prueba.o: el fichero object

Esa era la fase de compilación, es posible que a lo mejor te da algún error si yo me he equivocado en algo...

ee-gcc -mno-crt0 -T/usr/lib/ps2dev/ps2sdk/ee/startup/linkfile -nostartfiles -L/usr/lib/ps2dev/ps2sdk/ee/lib -o prueba.elf /usr/lib/ps2dev/ps2sdk/ee/startup/crt0.o prueba.o -lc -L/usr/lib/ps2dev/gsKit/lib -L/usr/local/ps2dev/ps2sdk/ports/lib -lsdl -lcdvd

ee-gcc: el compilador aunque ahora hace de linker
-mno-crt0: No linkea nada en el crt0.o
-T/usr/lib/ps2dev/ps2sdk/ee/startup/linkfile: el script que linkea para crt0
-nostartfiles: no utilizar el crt0 del sistema, hay que dar uno propio de ps2sdk
-L/usr/lib/ps2dev/ps2sdk/ee/lib: aquí debería estar libc.a para poder linkear con la librería C del propio ps2sdk
-o: salida
prueba.elf: tu fichero ELF
/usr/lib/ps2dev/ps2sdk/ee/startup/crt0.o: linkea con el crt0 del propio ps2sdk
prueba.o: linkea con tu fichero object que anteriormente hemos compilado
-lc: linkea el libc.a
-L/usr/lib/ps2dev/gsKit/lib: no entiendo por qué especifica este directorio si luego no linkea nada con libgskit.a ¿A lo mejor lo puedes quitar sin problemas?
-L/usr/local/ps2dev/ps2sdk/ports/lib: el directorio donde tendrías que tener libsdl.a
-lsdl: linkea la librería libsdl.a
-lcdvd: aquí también tengo mis dudas de si es necesario linkear con libcdvd.a. Posiblemente me equivoque pero parece que SDL se compila incluyendo ya dentro de libsdl.a todas las librerías necesarias como libcdvd.a y libgskit.a ¿Por eso a lo mejor tampoco hay que especificar -lgskit?

A lo mejor falla en algo, pero creo que te puede servir como base para crear tu propio comando para compilar y crear el fichero ELF en el mismo directorio donde tengas el prueba.c, así descartas otros errores del IDE.

Un saludo!



Gracias por tu respuesta, me pasa lo de antes me genera el ELF pero este no muestra imagen alguna en la salida de video. Y mira que lo intenté en windows en linux (pc y raspberry pi 3 B) pero nada debe ser cosa de mi consola o de los ps2sdk que bajo.

Gracias de todos modos, saludos.
Prueba con esto
#include <SDL/SDL>

SDL_Surface *screen;
int w=320;
int w=240;

int main(){
SDL_Init(SDL_INIT_VIDEO);
screen=SDL_SetVideoMode(w,h,24,SDL_HWSURFACE);
SDL_Fip(screen);
return 0;
}
5 respuestas