COmpilation SDL sous kubuntu

Résolu
metzo2702 Messages postés 18 Statut Membre -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

3 réponses

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    1. metzo2702 Messages postés 18 Statut Membre
       
      je les ai deja installé avant decompiler le programme
      0
    2. Bogomips Messages postés 131 Statut Membre 16
       
      Salut,

      #include <SDL/SDL.h>
      #include <SDL/SDL_image.h>
      0
    3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      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
    4. metzo2702 Messages postés 18 Statut Membre
       
      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
  2. Bogomips Messages postés 131 Statut Membre 16
     
    Il manque -lSDLmain avant ou après -lSDL.
    0
  3. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
     
    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
    1. metzo2702
       
      merci becoup la compilation a marché . Cependant quand je l execute j"ai l erreur suivante:
      Erreur de segmentation (core dumped)
      0
    2. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      Ç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
    3. metzo2702
       
      ok merci
      0
    4. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 944
       
      De rien bonne continuation !
      0