Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 10/08/2008, à 17:34

Pico51

Cross compilation avec SDL

Bonjour,
J'ai créé un programme avec la SDL ainsi que SDL_image et SDL_ttf mais je n'arrive pas à le cross compiler.
J'utilise mingw32 et lorsque je cross compile des programmes qui utilisent uniquement les bibliothèques standards, il n'y a pas de problème :

$ i586-mingw32msvc-gcc -o hello.exe hello.c
$wine hello.exe
Hello world !

Par contre, j'ai voulu cross compiler un programme utilisant uniquement SDL (pas SDL_image et _ttf) pour tester la SDL.
En ce moment, quand je cross compile, j'ai cette erreur :

$ i586-mingw32msvc-gcc -o degrade.exe main.c -lmingw32 -lSDLmain -lSDL
/tmp/cc3qsMvr.o:main.c:(.text+0x1a): undefined reference to `_SDL_Init'
/tmp/cc3qsMvr.o:main.c:(.text+0x30): undefined reference to `_SDL_SetVideoMode'
/tmp/cc3qsMvr.o:main.c:(.text+0x41): undefined reference to `_SDL_GetError'
/tmp/cc3qsMvr.o:main.c:(.text+0x47): undefined reference to `_stderr'
/tmp/cc3qsMvr.o:main.c:(.text+0x7e): undefined reference to `_SDL_CreateRGBSurface'
/tmp/cc3qsMvr.o:main.c:(.text+0x93): undefined reference to `_SDL_WM_SetCaption'
/tmp/cc3qsMvr.o:main.c:(.text+0xae): undefined reference to `_SDL_MapRGB'
/tmp/cc3qsMvr.o:main.c:(.text+0xbf): undefined reference to `_SDL_FillRect'
/tmp/cc3qsMvr.o:main.c:(.text+0xda): undefined reference to `_SDL_MapRGB'
/tmp/cc3qsMvr.o:main.c:(.text+0xeb): undefined reference to `_SDL_FillRect'
/tmp/cc3qsMvr.o:main.c:(.text+0x10b): undefined reference to `_SDL_UpperBlit'
/tmp/cc3qsMvr.o:main.c:(.text+0x119): undefined reference to `_SDL_Flip'
/tmp/cc3qsMvr.o:main.c:(.text+0x12c): undefined reference to `_SDL_FreeSurface'
/tmp/cc3qsMvr.o:main.c:(.text+0x134): undefined reference to `_SDL_Quit'
/tmp/cc3qsMvr.o:main.c:(.text+0x156): undefined reference to `_SDL_WaitEvent'
/usr/lib/gcc/i586-mingw32msvc/4.2.1-sjlj/../../../../i586-mingw32msvc/lib/libmingw32.a(main.o):(.text+0xe3): undefined reference to `_WinMain@16'
collect2: ld returned 1 exit status

J'ai essayé de pleins de manières différentes : j'ai changé l'ordre des paramètres, enlevé certaines bibliothèques (lmingw32 ou lSDLmain) mais rien n'y fait. Je pense, mais je suis loin d'en être sûr, que je n'ai pas les bonnes bibliothèques, que ce soit pour mingw32 et SDL.
Enfin, bref, pouvez-vous m'aider car cela fait une semaine que je regarde pleins de tutos et je n'ai encore pas réussi à compiler mon programme.

Merci beaucoup !

Hors ligne

#2 Le 10/08/2008, à 17:41

robrob

Re : Cross compilation avec SDL

Pour que ça marche, il te faut les versions windows des bibliothèques.

Hors ligne

#3 Le 10/08/2008, à 17:52

Pico51

Re : Cross compilation avec SDL

J'ai ajouté les fichiers SDL.lib et SDLmain.lib que j'ai téléchargé sur le site de la SDL dans la section Windows dans le dossier du cross compilateur mais je ne sais pas si il les lit car il m'indique toujours les erreurs là.

Hors ligne

#4 Le 10/08/2008, à 18:18

robrob

Re : Cross compilation avec SDL

il te faut les fichiers .a, les .lib c'est pour le compilateur microsoft il me semble

Hors ligne

#5 Le 10/08/2008, à 18:21

Pico51

Re : Cross compilation avec SDL

Oui, je viens de trouver mais maintenant, lorsque je compile, il me reste encore une erreur :

$ i586-mingw32msvc-gcc -o degrade.exe main.c -lmingw32 -lSDLmain -lSDL
/tmp/ccGlETg5.o:main.c:(.text+0x47): undefined reference to `_stderr'
collect2: ld returned 1 exit status

Dernière modification par Pico51 (Le 10/08/2008, à 18:27)

Hors ligne

#6 Le 10/08/2008, à 22:33

robrob

Re : Cross compilation avec SDL

A tout hasard, essaye de rajouter le flag -mwindows
(même si je ne vois pas trop ce qu'il viendrait faire avec stderr)

Ps: ah si en fait c'est lié:
http://sdl.beuc.net/sdl.wiki/FAQ_Windows_Why_stdout___stderr

Hors ligne

#7 Le 11/08/2008, à 09:35

Pico51

Re : Cross compilation avec SDL

Non, j'ai toujours cette erreur. Pourtant, j'ai essayé de rajouté -mwindows à plusieurs endroits mais rien n'y fait !
PS : C'est quoi ce flag si ce n'est pas une lib ?

Edit : Pour remédier temporrairement à ce problème, j'ai commenté, dans mon main.c, la ligne :

//fprintf(stderr, "Impossible de charger le mode vidéo : %s\nq", SDL_GetError());

Le programme marche donc quand je l'exécute avec wine :

$ wine degrade.exe
fixme:keyboard:X11DRV_LoadKeyboardLayout L"00000409", 0080: stub!
fixme:keyboard:X11DRV_LoadKeyboardLayout L"040c040c", 0001: stub!

Mais que veulent dire les messages qui viennent ensuite ?
Et comment faire pour que je puisse quand même exécuter mon programme sans commenter la ligne fprintf() ?

Dernière modification par Pico51 (Le 11/08/2008, à 09:53)

Hors ligne

#8 Le 12/08/2008, à 09:49

Pico51

Re : Cross compilation avec SDL

J'ai voulu cross compiler mon application avec SDL_image et SDL_ttf; je n'ai pas eu de problèmes pour ajouter les headers et les lib mais quand je lance l'application avec wine, j'ai les deux mêmes erreurs que tout à l'heure :

fixme:keyboard:X11DRV_LoadKeyboardLayout L"00000409", 0080: stub!
fixme:keyboard:X11DRV_LoadKeyboardLayout L"040c040c", 0001: stub!

Le problème, cette fois, c'est que mon application se lance puis disparaît immédiatement. J'ai également essayé de la lancer sur Windows mais cela se produit également.
Comment corriger ces erreurs ?

Hors ligne

#9 Le 12/08/2008, à 12:48

robrob

Re : Cross compilation avec SDL

Il y a 2 choses sans rapport:
- les lignes que tu mentionnes sont liées à wine et, à moins d'être developpeur wine, ne t'en préoccupe pas wink
- le fait que ton programme plante sous wine comme sous windows est lié à ton programme. Faut corriger les bugs!

Hors ligne

#10 Le 12/08/2008, à 13:27

Pico51

Re : Cross compilation avec SDL

Donc mon programme marche parfaitement sous Linux mais plante sous Windows ! Comment je sais ce qu'il faut corriger car la compilation se passe très bien et quand j'ai utilisé le débugger (option -g3 principalement), je n'ai eu aucun message d'erreur.
Je vais tout de même ajouter des sorties pour savoir où le programme plante.

Edit : J'ai mis un printf() après mes déclarations, il ne sortait pas et ensuite, j'en ai mis un avant, et il ne sortait pas non plus. Donc mon programme plante où ? Au niveau des includes ? du "int main (int argc, char *argv[])" ? C'est vraiment mon programme qui pose problème ?

Dernière modification par Pico51 (Le 12/08/2008, à 13:39)

Hors ligne

#11 Le 12/08/2008, à 15:15

robrob

Re : Cross compilation avec SDL

Le fait qu'il ne plante pas linux ne veut pas forcement dire que ton programme est bon. Le comportement des OS en cas d'erreur n'étant pas les mêmes (rien qu'entre différentes distribs linux tu peux avoir des différences notables).
Cela dit ça peut aussi venir d'un problème de bibliothèques.

Dans tout les cas, sans code source ça va être difficile de t'aiguiller roll

Hors ligne

#12 Le 12/08/2008, à 16:34

Pico51

Re : Cross compilation avec SDL

Bah si tu veux mon code source, tu peux le télécharger ici : http://tallotte.multi-heberg.net/brique.zip
Je ne vais pas le copier ici, parce que ce ferait beaucoup je trouve même si c'est un petit projet.

Hors ligne

#13 Le 12/08/2008, à 17:17

robrob

Re : Cross compilation avec SDL

J'ai la flemme d'installer SDL pour windows, mais une piste possible. Tu devrais vérifier que ces 2 opérations se passent bien (avec par exemple un printf + sortie du programme en cas d'erreur):
sBalle = IMG_Load ("ball.png");    (dans main.c)
TTF_OpenFont ("Garuda.ttf", 30); (dans afficherScore.c)
En effet, le cas échéant, ton programme plante.

Sinon une petite suggestion dans afficherScore.c :
SDL_Color blanc = {255,255,255,0};
plutôt que
SDL_Color blanc = {255,255,255};

Hors ligne

#14 Le 12/08/2008, à 17:19

robrob

Re : Cross compilation avec SDL

ah sinon j'ai fait vite fait un makefile pour compiler en natif:

CC = gcc
CFLAGS = `sdl-config --cflags` -g -Wall -W
LFLAGS = `sdl-config --libs` -lSDL_ttf -lSDL_image

SRC = \
	main.c \
	afficherBrique.c \
	afficherScore.c \
	deplacerBalle.c \
	deplacerBarre.c \
	toucheBrique.c \
	zeroBrique.c	

OBJ = $(SRC:.c=.o)

brik: $(OBJ)
	$(CC) -o $@ $^ $(LFLAGS)

%.o: %.c
	$(CC) -o $@ -c $< $(CFLAGS)

clean:
	rm $(OBJ)

Hors ligne

#15 Le 12/08/2008, à 17:38

Pico51

Re : Cross compilation avec SDL

Oui, tu as raison, l'erreur vient bien de IMG_Load() et je viens de comprendre pourquoi et c'est simplement parce que (je suis un abruti fini !!!!!!!!!!!!!!!!!!!!!!!!) ou pour faire plus clair, j'avais oublié d'insérer une DLL.
Et c'est dans ces moments là que j'ai envie de dire : ... non, rien !

Mais quand même un immense merci pour toute ton aide qui m'a permis de me rendre compte que, ..., enfin voilà ! Merci !

Au fait, mon programme est 3 fois plus lent sous Windows Vista, c'est normal ?

Dernière modification par Pico51 (Le 12/08/2008, à 17:38)

Hors ligne

#16 Le 14/08/2008, à 12:55

Pico51

Re : Cross compilation avec SDL

En fait, j'ai calculé combien de fois mon programme était plus lent et j'ai constaté qu'une fonction était 6 fois plus lente sous Vista que sous Linux. Cette fonction utilise beaucoup SDL_BlitSurface().
Est-ce que cette fonction est plus lente sous Windows ? Y a t-il un moyen pour accélérer sous Windows ?

Hors ligne