COmpilation SDL sous kubuntu

Résolu/Fermé
metzo2702 Messages postés 17 Date d'inscription vendredi 18 janvier 2013 Statut Membre Dernière intervention 18 mai 2014 - 14 juin 2013 à 01:05
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 - 18 juin 2013 à 00:23
Salut tout le monde,
j'assaye de compiler un programme C dans lequel j'ai inclu la librairie SDL et SDL image sous kubuntu mais à chaque compilation j'ai l'erreur suivant:
mohamed@mohamed-HP-630-Notebook-PC:~$ gcc -o Calculatrice/Projet.x Calculatrice/Projet.c -ISDL -ISDL_image
Calculatrice/Projet.c:3:17: erreur fatale: sdl.h : Aucun fichier ou dossier de ce type
compilation terminée.
.
j'ai besoin d' aide.
Merci d'avance
A voir également:

3 réponses

mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
14 juin 2013 à 01:10
Il faut installer la librairie sdl au préalable. Pour cela il faut retrouver le bon paquet que tu peux chercher avec apt-cache. Par convention les paquets de développement sont suffixés "-dev" et préfixés lib :

apt-cache search libsdl | grep dev


Tu vas voir parmi les lignes qui apparaissent un truc du genre :

...
libsdl1.2-dev - Simple DirectMedia Layer development files
...


Donc le paquet qui nous intéresse est ici : libsdl1.2-dev. Installons le avec apt-get :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install libsdl1.2-dev


... et normalement tu devrais pouvoir compiler ton programme...

Plus de détails sur apt ici :
http://www.mistra.fr/tutoriel-linux-apt.html

Bonne chance
0
metzo2702 Messages postés 17 Date d'inscription vendredi 18 janvier 2013 Statut Membre Dernière intervention 18 mai 2014
14 juin 2013 à 01:33
je les ai deja installé avant decompiler le programme
0
Bogomips Messages postés 123 Date d'inscription mardi 5 avril 2011 Statut Membre Dernière intervention 18 mars 2015 16
Modifié par Bogomips le 14/06/2013 à 01:58
Salut,

#include <SDL/SDL.h>
#include <SDL/SDL_image.h>
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
14 juin 2013 à 21:09
Oui Bogomips a mis le doigt dessus tu as sans doute écrit "#include <SDL.h>" au lieu de "#include <SDL/SDL.h>".

Sans option de compilation particulière (par exemple -I), cela signifie qu'on va chercher dans "/usr/include" le répertoire "SDL "dans lequel on espère trouver "SDL.h". Ce fichier devrait exister si tu as installé le paquet libsdl1.2-dev.

Bonne chance
0
metzo2702 Messages postés 17 Date d'inscription vendredi 18 janvier 2013 Statut Membre Dernière intervention 18 mai 2014
Modifié par mamiemando le 15/06/2013 à 11:24
Je l'ai fait mais j'ai cette erreur :

mohamed@mohamed-HP-630-Notebook-PC:~$ gcc -o Calculatrice/Projet.x Calculatrice/Projet.c -ISDL -ISDL_image
/tmp/ccYabvkE.o: In function 'pause':
Projet.c:(.text+0x16): undefined reference to 'SDL_WaitEvent'
/tmp/ccYabvkE.o: In function 'main':
Projet.c:(.text+0x4b): undefined reference to 'SDL_Init'
Projet.c:(.text+0x61): undefined reference to 'SDL_GetError'
...
Projet.c:(.text+0xc9d): undefined reference to 'SDL_FreeSurface'
Projet.c:(.text+0xcbb): undefined reference to 'SDL_FreeSurface'
Projet.c:(.text+0xcc0): undefined reference to 'SDL_Quit'
collect2: ld a retourné 1 code d'état d'exécution
0
Bogomips Messages postés 123 Date d'inscription mardi 5 avril 2011 Statut Membre Dernière intervention 18 mars 2015 16
15 juin 2013 à 00:17
Il manque -lSDLmain avant ou après -lSDL.
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
Modifié par mamiemando le 15/06/2013 à 11:27
Pour compléter ce que dit Bogomips, quand tu as un "undefined reference", c'est que dans la dernière étape de linkage, tu as oublié de passer en paramètres des binaires contenant les fonctions utilisées par ton programme.

Ces fonctions peuvent être contenues dans un ".o" (si c'est une fonction que tu as codé dans ton programme) ou d'un ".a" (librairie statique) ou d'un ".so" (librairie dynamique) s'il provient d'une librairie.

Ici il s'agit de fonctions de la SDL, donc c'est clairement qu'on a oublié de passer la librairie SDL en paramètre. Maintenant il s'agit de choisir entre ".a" et ".so".

Linker un programme avec une librairie

En général, on linke le programme avec la librairie ".so" (shared object) car ça permet de bénéficier des mises à jour de cette librairie et ça fait un programme moins volumineux (tandis qu'un ".a" est "copié" dans ton exécutable et permet d'avoir un programme stand alone). C'est donc l'option "-l" qu'on utilise. Dans ton cas on va donc linker avec le ".so".

Point suivant à régler, comment linker son programme avec un ".so". Sous linux les librairies dynamiques ont toutes un nom de la forme "lib***.so", par exemple libtoto.so. Si on veut linker le programme avec cette librairie on passera donc à la dernière ligne de compilation "-ltoto".

Retrouver le nom de la librairie

Il ne reste plus qu'à retrouver le nom de la librairie avec laquelle on veut linker le programme. Dans le cas qui nous intéresse, on peut utiliser apt-file pour voir les librairies que fournit le paquet libsdl1.2-dev.

Remarque : les commandes qui sont dans ce paragraphe sont spécifiques aux distributions basées sur debian (dont ubuntu fait partie), sur une autre distribution linux il faudrait adapter ce qui suit.

sudo apt-get install apt-file
apt-file update
apt-file list libsdl1.2-dev | grep -i "/lib" | grep ".so$"


Une autre approche consiste à directement lister le contenu du paquet s'il est encore dans ton cache :

dpkg --contents /var/cache/apt/archives/libsdl1.2-dev*deb


Exemple :

(mando@silk) (~) $ apt-file list libsdl1.2-dev | grep -i "/lib" | grep ".so$"
libsdl1.2-dev: /usr/lib/x86_64-linux-gnu/libSDL.so


Retour à ton problème

Ici on voit que la librairie s'appelle "libSDL.so" donc l'option à passer à la compilation sera comme l'a indiqué Bogomips "-lSDL".

Conclusion, la ligne qui sert à compiler ton fichier ".c" contenant le main (que je nomme main.c dans cet exemple) et qui doit être linké avec lSDL serait la suivante, si on suppose que ton programme utilise également les fichiers module1.o et module2.o

gcc -W -Wall -o programme libSDL.so module1.o module2.o -lSDL


Bonne chance
0
merci becoup la compilation a marché . Cependant quand je l execute j"ai l erreur suivante:
Erreur de segmentation (core dumped)
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
17 juin 2013 à 10:32
Ça c'est un autre problème donc un autre fil de discussion. C'est que ton programme comporte une erreur de raisonnement et accède à une zone mémoire à laquelle il n'est pas sensé accéder.

Pour voir où ça plante :

gcc -g -Wall -W -c module1.c
gcc -g -Wall -W -c module2.c
gcc -g -W -Wall -o programme libSDL.so module1.o module2.o -lSDL
gdb programme


Une fois dans gdb :

r
bt


Je t'invite à ouvrir un nouveau fil de discussion si tu ne t'en sors pas car le sujet initial est résolu et pour plus de lisibilité, on essaye d'avoir un fil de discussion par problème.
0
ok merci
0
mamiemando Messages postés 33093 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 4 mai 2024 7 752
18 juin 2013 à 00:23
De rien bonne continuation !
0