COmpilation SDL sous kubuntu
Résolu
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
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:
- COmpilation SDL sous kubuntu
- Breach compilation c'est quoi - Guide
- Kubuntu download - Télécharger - Utilitaires
- Kubuntu dual boot - Forum Ubuntu
- Compilation error: expected unqualified-id before '{' token ✓ - Forum C++
- DELPHI SOUS KUBUNTU - Forum Ubuntu
3 réponses
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 :
Tu vas voir parmi les lignes qui apparaissent un truc du genre :
Donc le paquet qui nous intéresse est ici : libsdl1.2-dev. Installons le avec apt-get :
... 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
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
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.
Une autre approche consiste à directement lister le contenu du paquet s'il est encore dans ton cache :
Exemple :
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
Bonne chance
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
Ç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 :
Une fois dans gdb :
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.
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.
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