PDA

Ver la versión completa : Ayuditis -> cuelgue extraño, makefiles, toolchains y demás...



gade
06/03/2008, 05:08
Hola! últimamente he pasado unas noches programando un juego para la gp2x, con la ilusión de presentarlo a la pdroms compo. El problema viene que el plazo es hasta este domingo y yo aunque todo el código lo había programado y probado en linux, con todo preparado para portarlo, pensando que todo sería simple y agradable...y hoy he empezado a testear todo en la gp2x y ha sido horrible!!! :S

Estoy usando la toolchain de Open2x, y no entiendo nada :S, primero si inicio por HW todo va lentísimo... porque?¿, y lo más importante no consigo pasar de la intro porque me explota todo brutalmente con un error que tiene que ver con la compilación seguro:


Running Main menu...
./tiny.gpe: relocation error: ./tiny.gpe: symbol __floatsisf, version GCC_3.0 not defined in file libgcc_s.so.1 with link time reference
[root@gp2x tinyworld]$


Y yo no tengo mucha practica en compilar usando makefiles, por lo que no sé que leches hago mal :S

Si algun programador con más experiencia me echa un cable le agradecería infinitamente... :brindis:
Dejo aqui el makefile, que probablemente no este muy correcto:


PROG_NAME = tiny
SOURCES = src/main.cpp

OBJECTS = $(SOURCES:.cpp=.o)
BIN = $(PROG_NAME)
BIN_GP = $(PROG_NAME).gpe

CROSS_PATH = /opt/open2x/gcc-4.1.1-glibc-2.3.6/

CXXFLAGS = -c -Wall -Wextra
LDFLAGS = -lm -lg -lpthread -lSDL -lSDL_mixer -lSDL_ttf -lSDL_image
LDFLAGS_GP = -DGP2X_MODE `$(CROSS_PATH)bin/sdl-config --cflags` `$(CROSS_PATH)bin/sdl-config --static-libs`


ifdef arm
CXX = $(CROSS_PATH)bin/arm-open2x-linux-g++
CXXFLAGS += -I$(CROSS_PATH)include -DGP2X_MODE `$(CROSS_PATH)bin/sdl-config --cflags` `$(CROSS_PATH)bin/sdl-config --static-libs`
else
CXX = g++
CXXFLAGS += `sdl-config --cflags`
endif

all:
make cleanobjs
make pcversion
make cleanobjs
make gpversion arm=1

pcversion: $(SOURCES) $(BIN)

gpversion: $(SOURCES) $(BIN_GP)

$(BIN): $(OBJECTS)
$(CXX) $(LDFLAGS) $(OBJECTS) -o $@


$(BIN_GP): $(OBJECTS)
$(CXX) $(LDFLAGS_GP) $(LDFLAGS) $(OBJECTS) -o $@

.cpp.o:
$(CXX) $(CXXFLAGS) $< -o $@

cleanobjs:
rm -f $(OBJECTS)

clean:
-rm -f $(BIN_GP) $(BIN) *~ *.o *.bak


Cuya salida es:


jon@jon-laptop:~/Programacion/2d/tinyworld$ make
make cleanobjs
make[1]: se ingresa al directorio `/home/jon/Programacion/2d/tinyworld'
rm -f src/main.o
make[1]: se sale del directorio `/home/jon/Programacion/2d/tinyworld'
make pcversion
make[1]: se ingresa al directorio `/home/jon/Programacion/2d/tinyworld'
g++ -c -Wall -Wextra `sdl-config --cflags` src/main.cpp -o src/main.o
src/main.cpp:3: aviso: parámetro ‘argc’ sin uso
src/main.cpp:3: aviso: parámetro ‘argv’ sin uso
src/main.cpp: In member function ‘void Game::intro()’:
src/main.cpp:68: aviso: variable ‘temp4’ sin usar
g++ -lm -lg -lpthread -lSDL -lSDL_mixer -lSDL_ttf -lSDL_image src/main.o -o tiny
make[1]: se sale del directorio `/home/jon/Programacion/2d/tinyworld'
make cleanobjs
make[1]: se ingresa al directorio `/home/jon/Programacion/2d/tinyworld'
rm -f src/main.o
make[1]: se sale del directorio `/home/jon/Programacion/2d/tinyworld'
make gpversion arm=1
make[1]: se ingresa al directorio `/home/jon/Programacion/2d/tinyworld'
/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/arm-open2x-linux-g++ -c -Wall -Wextra -I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include -DGP2X_MODE `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --cflags` `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --static-libs` src/main.cpp -o src/main.o
src/main.cpp:3: warning: unused parameter 'argc'
src/main.cpp:3: warning: unused parameter 'argv'
src/main.cpp: In member function 'void Game::intro()':
src/main.cpp:68: warning: unused variable 'temp4'
arm-open2x-linux-g++: -rpath: linker input file unused because linking not done
arm-open2x-linux-g++: /opt/open2x/gcc-4.1.1-glibc-2.3.6/lib: linker input file unused because linking not done
arm-open2x-linux-g++: -lSDL: linker input file unused because linking not done
arm-open2x-linux-g++: -lpthread: linker input file unused because linking not done
arm-open2x-linux-g++: -lm: linker input file unused because linking not done
arm-open2x-linux-g++: -ldl: linker input file unused because linking not done
/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/arm-open2x-linux-g++ -DGP2X_MODE `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --cflags` `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --static-libs` -lm -lg -lpthread -lSDL -lSDL_mixer -lSDL_ttf -lSDL_image src/main.o -o tiny.gpe
make[1]: se sale del directorio `/home/jon/Programacion/2d/tinyworld'
jon@jon-laptop:~/Programacion/2d/tinyworld$



SIENTO MUCHO LA CHAPA...:rolleyes:, y postear solo cuando necesito algo, después de años leyendo a diario... ?¿

Si todo sale bien, necesitaré también que alguien prueba la beta antes de enviarla, si alguien le apetece...

El juego será algo parecido a exploración y plataformas, en 4 colores, esta en c++ todo, con ayuda de tinyxml, y liberaré el código cuando todo este funcionando y limpito.

Una imagen:
http://elektrotokyo.com/wp-content/uploads/2008/02/pantallazo-tinyworld-001.png

juanvvc
06/03/2008, 10:57
La Gp2x tiene un mont&#243;n de firmwares diferentes, as&#237; que debes linkar las librer&#237;as est&#225;ticamente, aunque ocupen m&#225;s as&#237;, para ahorrarte los errores que dices arriba. A&#241;ade -static a LDFLAGS_GP (no, llamar a sdl-config con --static-libs no es suficiente) Adem&#225;s te falta una llamada a strip (de Open2x) sobre el ejecutable final para reducir un poco el tama&#241;o final del archivo. El resto del Makefile se ve bien.

En cuanto a superficie HW lenta: la versi&#243;n de la SDL que viene con open2x soporta las superficies HW sin doble buffer, creo recordar, pero no est&#225; de m&#225;s que pruebes tambi&#233;n SW y combinaciones del doble buffer a ver qu&#233; tal. De todas formas si no usabas -static entonces utilizabas las librer&#237;as SDL que ven&#237;an con la consola, y &#233;sas a saber qu&#233; soportan...

gade
06/03/2008, 13:29
&#161;Muchas gracias juanvc! ya habia intentado compilar est&#225;ticamente, pero me da un error que no entiendo de donde viene &#191;?&#191;?:confused:
Debe ser alguna tonter&#237;a, pero lo dicho, con makefiles y tal me lio r&#225;pidamente, la salida del make es:


make[1]: se ingresa al directorio `/home/jon/Programacion/2d/tinyworld'
/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/arm-open2x-linux-g++ -c -Wall -Wextra -I/opt/open2x/gcc-4.1.1-glibc-2.3.6/include -DGP2X_MODE -static `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --cflags` src/main.cpp -o src/main.o
/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/arm-open2x-linux-g++ -static -DGP2X_MODE `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --static-libs` -lm -lg -lpthread -lSDL -lSDL_mixer -lSDL_ttf -lSDL_image src/main.o -o tiny.gpe
src/main.o: In function `KeyController::RefreshKeyStatus()':
main.cpp:(.text+0xeb7c): undefined reference to `SDL_PumpEvents'
main.cpp:(.text+0xef8c): undefined reference to `SDL_PollEvent'
src/main.o: In function `Font::GetWidth(char*)':
main.cpp:(.text+0xf044): undefined reference to `TTF_RenderText_Blended'
src/main.o: In function `Font::GetHeight(char*)':
main.cpp:(.text+0xf0a8): undefined reference to `TTF_RenderText_Blended'
....
.
.
.
.


Da un mont&#243;n de undefined references, que entiendo deben ser por no estas bien lincadas las sdl, pero no s&#233; que hago mal... arghh.. gracias!

juanvvc
06/03/2008, 17:08
Aqu&#237; me tiro a la piscina, pero es posible que sean las comillas invertidas. Yo tampoco me llevo bien con los Makefile as&#237; que seg&#250;n mis conocimientos las comillas invertidas solo funcionan si Saturno y Marte estan alineados con la Estrella Polar :)

Como puedes ver en la cuarta l&#237;nea de la salida de compilaci&#243;n que incluyes, a ti no te est&#225;n funcionando. Cambia al menos lo de `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --static-libs` por la salida real de ese comando en tu sistema, no lo llames desde dentro del Makefile.

headoverheels
06/03/2008, 17:31
En cuanto a superficie HW lenta: la versión de la SDL que viene con open2x soporta las superficies HW sin doble buffer, creo recordar, pero no está de más que pruebes también SW y combinaciones del doble buffer a ver qué tal.
Creo recordar que en las SDL de Open2x cuando usas una superficie HW con doble buffer, al hacer el SDL_Flip se espera al vsync, por eso te irá bastante más lento.

gade
06/03/2008, 20:35
:confused: nada no tira ni con comillas ni sustituyéndolas... gracias de todos modos, me estoy planteando liberar ahora todo y si alguien quiere que me eche una manita.... :)

< - >
Finalmente voy a dejar aqu&#237; el estado actual del proyecto, si alguien consigue compilarlo estaticamente o decide ayudarme a finalizarlo que contacte mediante mail en la direcci&#243;n que viene en el readme.

La idea es tener arreglado el problema de la compilaci&#243;n antes de el sabado para poder enviarlo a la competici&#243;n, me hace ilusi&#243;n enviarlo auque no haya mucho hecho.

LINK: http://elektrotokyo.com/proyectos/tinyworld-0.0.1.zip
Es solo c&#243;digo y este zip no tiene interes ninguno para los jugadores.

lemon
07/03/2008, 12:05
El order de los parametros es importante para enlazar.
No se cual es el correcto pero me he encontrado muchas veces con cosas asi.
Por ejemplo, creo que el -lSDL_ttf tiene que ir antes que el -SDL o si no no tira, nunca me he mirado detenidamente como tiene que ser el order.

Por si te sirve de ayuda, en el makefile que uso actualmente, me hace esto:

/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/arm-open2x-linux-g++ -s -static obj/main.o obj/gl.o -o bin/main.gpe -lSDL_ttf -lfreetype `/opt/open2x/gcc-4.1.1-glibc-2.3.6/bin/sdl-config --static-libs`

o sea, primero -SDL_ttf, luego -lfreetype (si pongo freetype antes que las SDL_ttf no tira), y luego lo que me echa el sdl-config, que es ya todo el resto. Tu tendras que añadirle el miger y el image, yo de ti probaria justo antes del sdl-config, y si no pues vas cambiando el orden hasta que salga.
Suerte!

juanvvc
07/03/2008, 12:52
Te env&#237;o el Makefile que compila tu programa. Lo he probado en la Gp2x y funciona, pero el mu&#241;eco no se mueve. Tambi&#233;n es lento, lento, no llega a 5FPS. La llamada a SDL_Flip() en juego.cpp es uno de los principales causantes, pero seguramente no el &#250;nico. Ten en cuenta que la Gp2x no tiene unidad de coma flotante, as&#237; que las operaciones con decimales le cuestan much&#237;simo. En FPSController::Wait tienes una que se repite muchas veces en el bucle principal.

Para usar el makefile, ll&#225;malo Makefile.gp2x y compila con "make -f Makefile.gp2x" Te env&#237;o mi Makefile porque es el que siempre uso y mejor conozco, pero seguro que tambi&#233;n puedes modificar tu propio Makefile para introducir las librer&#237;as SDL_ttf, SDL_image, libpng, libjpeg, libz y libfreetype (&#161;en ese orden!) en la variable LDFLAGS_GP antes de las llamadas a sdl-config

gade
07/03/2008, 12:56
***** juanvvc no sabes cuanto te lo agradezco!!!:brindis:, voy a probarlo ahora mismo, respecto a los fps ya me habia dado cuetna pero esa versión que he colgado no esta ni optimizada ni pensada para la gp2x, y no estaban mapeados los controles del joystick.

Mil gracias lemon tu tambien me has ayudado mucho, el orde era exactamente lo que me fallaba y ya estaba arreglandolo más o menos....

Voy a probar todo, gracias de nuevo, ya os contare como queda todo para el concurso...
:lovegp2x:

juanvvc
07/03/2008, 13:06
Vuelve a leer mi mensaje, que te a&#241;ade algunos consejos de optimizaci&#243;n que quiz&#225; no hayas leido porque lo edit&#233; despu&#233;s de tu mensaje :) Por cierto, me acabo de dar cuenta de que el Makefile que te envi&#233; no define GP2X_MODE sino GP2X, si lo usas tendr&#225;s que cambiarlo

gade
07/03/2008, 13:18
Vuelve a leer mi mensaje, que te añade algunos consejos de optimización que quizá no hayas leído porque lo edité después de tu mensaje :) Por cierto, me acabo de dar cuenta de que el Makefile que te envié no define GP2X_MODE sino GP2X, si lo usas tendrás que cambiarlo

Ohhh gracias!!, no me acordaba para nada que tenia esa operación por ahí, esas librerias las programe hace tiempo para juegos en linux :), he iniciado sdl con 8 bits, voy a quitar las restricciones de fps y mirar como de rápido puede ir sin penalizaciones...