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
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
A voir également:
- COmpilation SDL sous kubuntu
- Compilation pdf - Guide
- Breach compilation - Guide
- Kubuntu - Télécharger - Utilitaires
- Erreur de compilation dans le module caché thisworkbook ✓ - Forum Excel
- Sdl vs gtk ✓ - Forum Audio
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
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 :
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
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
15 juin 2013 à 00:17
Il manque -lSDLmain avant ou après -lSDL.
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
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.
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
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
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 :
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.
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
18 juin 2013 à 00:23
De rien bonne continuation !
14 juin 2013 à 01:33
Modifié par Bogomips le 14/06/2013 à 01:58
14 juin 2013 à 21:09
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
Modifié par mamiemando le 15/06/2013 à 11:24