1

Bonjour,

Je suis en train de suivre le tuto du Site du Zéro sur le SDL.

Voici par exemple le code qui me pose problème sur la GP2X:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <SDL/SDL.h>

/* GP2X button mapping */
enum MAP_KEY
{
	VK_UP         , // 0
	VK_UP_LEFT    , // 1
	VK_LEFT       , // 2
	VK_DOWN_LEFT  , // 3
	VK_DOWN       , // 4
	VK_DOWN_RIGHT , // 5
	VK_RIGHT      , // 6
	VK_UP_RIGHT   , // 7
	VK_START      , // 8
	VK_SELECT     , // 9
	VK_FL         , // 10
	VK_FR         , // 11
	VK_FA         , // 12
	VK_FB         , // 13
	VK_FX         , // 14
	VK_FY         , // 15
	VK_VOL_UP     , // 16
	VK_VOL_DOWN   , // 17
	VK_TAT          // 18
};

/* The screen surface, joystick device */
SDL_Surface *screen = NULL;
SDL_Joystick *joy = NULL;

void Terminate(void)
{
	SDL_Quit();
#ifdef GP2X
	chdir("/usr/gp2x");
	execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif
}

int main (int argc, char *argv[])
{
	SDL_Surface *backgroundImage = NULL;
	SDL_Rect positionBackground;
	positionBackground.x = positionBackground.y = 0;
	
	int done;

	/* Initialize SDL */
	if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) {
		fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	atexit (Terminate);

	SDL_ShowCursor(SDL_DISABLE);
	
#ifndef GP2X
	/* Set 640x480 16-bits video mode */
	if ((screen = SDL_SetVideoMode (800, 600, 16, SDL_HWSURFACE)) == NULL) {
		fprintf (stderr, "Couldn't set 640x480x16 video mode: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	SDL_WM_SetCaption("Chargement d'image en SDL", NULL);
	/* Chargement d'une image Bitmap dans une surface */
	backgroundImage = SDL_LoadBMP("images/lac_en_montagne.bmp");
#endif

#ifdef GP2X
	/* Set 320x240 16-bits video mode */
	if ((screen = SDL_SetVideoMode (320, 240, 16, SDL_HWSURFACE)) == NULL) {
		fprintf (stderr, "Couldn't set 320x240x16 video mode: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	/* Chargement d'une image Bitmap dans une surface */
	backgroundImage = SDL_LoadBMP("images/lac_en_montagne_gp2x.bmp");
#endif

	/* Check and open joystick device */
	if (SDL_NumJoysticks() > 0) {
		joy = SDL_JoystickOpen(0);
		if(!joy) {
			fprintf (stderr, "Couldn't open joystick 0: %s\n", SDL_GetError ());
		}
	}
	/* On blitte (colle) par-dessus l'écran */
	SDL_BlitSurface(backgroundImage, NULL, screen, &positionBackground);
    SDL_Flip(screen); // Mise à jour de l'écran
	
	done = 0;
	while (!done)
	{
		SDL_Event event;

		/* Check for events */
		while (SDL_PollEvent (&event))
		{
			switch (event.type)
			{
				case SDL_KEYDOWN:
					/* if press Ctrl + C, terminate program */
					if ( (event.key.keysym.sym == SDLK_c) && (event.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) )
						done = 1;
					break;
				case SDL_KEYUP:
					break;
				case SDL_JOYBUTTONDOWN:
					/* if press Start button, terminate program */
					if ( event.jbutton.button == VK_START )
						done = 1;
					break;
				case SDL_JOYBUTTONUP:
					break;
				case SDL_QUIT:
					done = 1;
					break;
				default:
					break;
			}
		}

		/* Processing */
	}
	
	SDL_FreeSurface(backgroundImage);
	return EXIT_SUCCESS;
}


La compilation se déroule sans problème. Sous macosx, je lie de manière dynamique la SDL. Sous gp2x, je compile statiquement.
Sous macosx, aucun problème. Sous gp2x, un ecran noir s'affiche et je suis contraints d'étaindre la GP2X. Où ce situe le problème?
Voici les makefiles

Pour OSX
PLATFORM=OSX

SDL_BASE=/sw/bin/
LDFLAGS=

CC=gcc
CXX=g++
STRIP=strip

CFLAGS=`$(SDL_BASE)sdl-config --cflags` -O2 -Wall -Werror
CXXFLAGS=`$(SDL_BASE)sdl-config --cflags` -O2 -Wall -Werror
LIBS=`$(SDL_BASE)sdl-config --libs`

BUILD_DIR = ./build/osx/

TARGET=$(BUILD_DIR)SDL-2

include Makefile.in


Pour GP2X:
PLATFORM=GP2X

CROSS_COMPILE=/Volumes/GP2XSDK/bin/arm-gp2x-linux-
SDL_BASE=/Volumes/GP2XSDK/arm-gp2x-linux/bin/arm-linux-
LDFLAGS=-static

CC=$(CROSS_COMPILE)gcc
CXX=$(CROSS_COMPILE)g++
STRIP=$(CROSS_COMPILE)strip

CFLAGS=`$(SDL_BASE)sdl-config --cflags` -O2 -Wall -Werror
CXXFLAGS=`$(SDL_BASE)sdl-config --cflags` -O2 -Wall -Werror
LIBS=`$(SDL_BASE)sdl-config --libs`

BUILD_DIR = ./build/gp2x/

TARGET=$(BUILD_DIR)SDL.gpe

include Makefile.in


Le makefile.in
SRC_DIR = ./src/

OBJS=$(BUILD_DIR)main.o

ALL_TARGETS=$(TARGET)

all: $(ALL_TARGETS)


$(TARGET): $(OBJS)
	$(CC) -D$(PLATFORM) $(LDFLAGS) -o $(TARGET) $(OBJS) $(LIBS) $(CFLAGS)
	$(STRIP) $(TARGET)

$(BUILD_DIR)main.o: $(SRC_DIR)main.c
	$(CC) $(CFLAGS) -o $@ -c $<

clean:
	rm $(BUILD_DIR)*.o $(TARGET)


D'avance merci de votre aide.

PS: pour ceux que cela intéresse, voici le SDK officiel adapté pour MacOSX
tromb Fichier joint : gp2xsdk_macosx.zip

2

hum essaye de lancer par telnet ton prog t'aura des messages d'erreur pitetre.. je sais pas trop la.. je suis pas un pro meme po un amateur.. c'esr juste une astuce pour voir les prob grin ou pitetre avec gmenu2x tu active le log dans les options tu lance ton prog et puis ben tu va voir le log..

Pour eviter le reboot tu peux essayer de lancer ton prog avec un script qui relance le menu apres ton prog ..
avatarTout probleme a sa solution
Oeil de feu

3

as tu recopié les fichier images tels que "images/lac_en_montagne.bmp" utilisées par ton programme sur ta carte SD ?

4

Salut,

Oui, j'ai bien copié les fichiers images.

L'écran noir s'affiche également dans le cas du programme plus simple encore qui se contente d'affichier un fonds bleu-vert et u rectangle blanc...
Sur MacOSX, pas de problème... Sur GP2X, écran noir???

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <SDL/SDL.h>

/* GP2X button mapping */
enum MAP_KEY
{
	VK_UP         , // 0
	VK_UP_LEFT    , // 1
	VK_LEFT       , // 2
	VK_DOWN_LEFT  , // 3
	VK_DOWN       , // 4
	VK_DOWN_RIGHT , // 5
	VK_RIGHT      , // 6
	VK_UP_RIGHT   , // 7
	VK_START      , // 8
	VK_SELECT     , // 9
	VK_FL         , // 10
	VK_FR         , // 11
	VK_FA         , // 12
	VK_FB         , // 13
	VK_FX         , // 14
	VK_FY         , // 15
	VK_VOL_UP     , // 16
	VK_VOL_DOWN   , // 17
	VK_TAT          // 18
};

/* The screen surface, joystick device */
SDL_Surface *screen = NULL;
SDL_Joystick *joy = NULL;

void Terminate(void)
{
	SDL_Quit();
#ifdef GP2X
	chdir("/usr/gp2x");
	execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif
}

int main (int argc, char *argv[])
{
	SDL_Surface *rectangle = NULL;
	SDL_Rect position;
	
	int done;

	/* Initialize SDL */
	if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_JOYSTICK) < 0) {
		fprintf (stderr, "Couldn't initialize SDL: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	atexit (Terminate);

	SDL_ShowCursor(SDL_DISABLE);
	
#ifndef GP2X
	/* Set 640x480 16-bits video mode */
	if ((screen = SDL_SetVideoMode (640, 480, 16, SDL_HWSURFACE)) == NULL) {
		fprintf (stderr, "Couldn't set 640x480x16 video mode: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 220, 180, 16, 0, 0, 0, 0); // Allocation de la surface
	SDL_WM_SetCaption("Ma super fenêtre SDL!", NULL);
#endif

#ifdef GP2X
	/* Set 320x240 16-bits video mode */
	if ((screen = SDL_SetVideoMode (320, 240, 16, SDL_HWSURFACE)) == NULL) {
		fprintf (stderr, "Couldn't set 320x240x16 video mode: %s\n", SDL_GetError ());
		exit (EXIT_FAILURE);
	}
	rectangle = SDL_CreateRGBSurface(SDL_HWSURFACE, 110, 90, 16, 0, 0, 0, 0); // Allocation de la surface
#endif

	/* Check and open joystick device */
	if (SDL_NumJoysticks() > 0) {
		joy = SDL_JoystickOpen(0);
		if(!joy) {
			fprintf (stderr, "Couldn't open joystick 0: %s\n", SDL_GetError ());
		}
	}

	// Coloration de l'écran avec un bleu-vert
	SDL_FillRect(screen, NULL, SDL_MapRGB(screen->format,17,206,112));
	position.x = (screen->w / 2) - (rectangle->w / 2); // La surface sera centrée
	position.y = (screen->h / 2) - (rectangle->h / 2);
	SDL_FillRect(rectangle, NULL, SDL_MapRGB(rectangle->format, 255, 255, 255)); // Remplissage de la surface avec du blanc
	SDL_BlitSurface(rectangle, NULL, screen, &position); // Collage de la surface sur l'écran
    SDL_Flip(screen); // Mise à jour de l'écran
	
	done = 0;
	while (!done)
	{
		SDL_Event event;

		/* Check for events */
		while (SDL_PollEvent (&event))
		{
			switch (event.type)
			{
				case SDL_KEYDOWN:
					/* if press Ctrl + C, terminate program */
					if ( (event.key.keysym.sym == SDLK_c) && (event.key.keysym.mod & (KMOD_LCTRL | KMOD_RCTRL)) )
						done = 1;
					break;
				case SDL_KEYUP:
					break;
				case SDL_JOYBUTTONDOWN:
					/* if press Start button, terminate program */
					if ( event.jbutton.button == VK_START )
						done = 1;
					break;
				case SDL_JOYBUTTONUP:
					break;
				case SDL_QUIT:
					done = 1;
					break;
				default:
					break;
			}
		}

		/* Processing */
	}
	
	SDL_FreeSurface(rectangle);
	return EXIT_SUCCESS;
}

5

Salut,
je crois que tu as peut-être le même soucis que moi : la misère pour compiler en static avec la SDL.
Peux tu regarder ce qu'indique la commande "readelf" sur ton executable gp2x et sur celui pour linux ?

readelf tonExecutable -d pour voir quelles sont les libs appelées dynamiquement. Si tu as biencompilé en statiques, alors ça ne devrait rien sortir. Sinon... sorry Moi j'ai posé la question sur gpfrance et Jycet a essayé de m'aider mais je bloque toujours. Ca commence à me déprimer lol smile j'aimerais bien pourvoir utiliser tranquilement la chaine Open2x (vivement que le firmware sorte !).

Tout mon code et dispo par SVN, si quelqu'un veut bien le compiler avec Open2x en statique, je l'adorerai : svn co svn://svn.gna.org/svn/henna/trunk henna

6

@Naloj:
Pour ma part, pour compiler en statique, je rajoute juste -static au cflags. Je ne vois pas -lpthread dans ton makfile, ca vient peut être de là?
J'aimerais bien t'aider à compiler ton projet, mais il me réclame TimerSDL.h que je n'ai pas (et je ne vois pas à quelle lib il se rapporte)

@brainois:
Pouvoir exécuter ton exemple via telnet permettrait de mieux cerner ton problème.
Si tu rajoute ce bloque (ou juste le SDL_Flip) dans ta boucle while principale, tu n'as toujours rien?
Edit: Non, mauvaise idée smile ton programme fonctionne parfaitement sur ma gp2x. Mais j'utilise le toolchain d'open2x. Je pense que le problème vient de celui que tu utilises.
Et la c'est le drame: je vois que sous macos, il n'y a pas de version d'open2x précompilé...