Interface C/Ada + SDL

Interface C/Ada + SDL - C - Programmation

Marsh Posté le 13-04-2009 à 20:56:27    

Bonjour à tous,
 
Dans le cadre d'un projet scolaire je dois programmer un petit jeu en ADA.  
Il se trouve que j'aimerais faire une interface graphique en SDL.
J'ai donc essayé AdaSDL dispo sur les serveurs de l'ensimag mais elle ne comporte beaucoup de fonctions, c'est pourquoi j'ai décidé d'essayer de faire l'interfaçage en C et Ada moi même.
 
ALors voila comment je fais, (suivant un cours trouvé sur le net: http://doc.ubuntu-fr.org/sdl)
 
Je veux appeler du C a partir d'ADa donc je ne crée pas de main() en C sinon erreur de compilation (testée :) )
 
Voici mon code C:

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <SDL/SDL.h>
  4. void pause()
  5. {
  6.     int continuer = 1;
  7.     SDL_Event event;
  8.     while (continuer)
  9.     {
  10.         SDL_WaitEvent(&event);
  11.         switch(event.type)
  12.         {
  13.             case SDL_QUIT:
  14.                 continuer = 0;
  15.         }
  16.     }
  17. }
  18. int main_c(int argumentc)
  19. {
  20.     SDL_Init(SDL_INIT_VIDEO);
  21.     SDL_SetVideoMode(640, 480, 32, SDL_HWSURFACE);
  22.     pause();
  23.     SDL_Quit();
  24.     return EXIT_SUCCESS;
  25. }


 
Et voici le code ada :  
 

Code :
  1. with ada.text_io, Ada.integer_text_io, Interfaces.C;
  2. use ada.text_io, Ada.integer_text_io, Interfaces.C;
  3. procedure essaiADA is
  4. function appel_c(input: integer)  return integer;
  5. pragma import(C, appel_c, "main_c" );
  6. result: integer;
  7. begin
  8. result:=appel_c(0);
  9. put(result);
  10. end essaiADA;


 
Au niveau de la syntaxe normalement il n'y a pas de problèmes ayant testé avec une fonction sans appel de fonctions SDL (est ce bien clair ... : :heink: )
 
Ensuite il faut que je cree le fichier objet du prog en C et que je compile mon .adb avec le .o , voici les lignes de commandes:

Code :
  1. gcc -g -c codec.c
  2. gnatmake -gnatf codeada.adb -cargs -g -largs -g codec.o


Et bam erreur de compilation, evidemment SDL pose un probleme.  
J'ai donc fait un autre essai (avec une ligne piquée sur doc.ubuntu-fr.org/sdl)

Code :
  1. gcc `sdl-config --cflags --libs` -g -c codec.c
  2. gnatmake -gnatf codeada.adb -cargs -g -largs -g codec.o


Voici les erreurs de compilation que j'obtiens: (aucun message quoi que je fasse a la création du .o en C)
 
 

Code :
  1. gnatmake -gnatf essaiAda.adb -cargs -g -largs -g codeC.o
  2. codec.o: In function `pause':
  3. codeC.c:20: undefined reference to `SDL_WaitEvent'
  4. codeC.o: In function `main_c':
  5. codeC.c:32: undefined reference to `SDL_Init'
  6. codeC.c:34: undefined reference to `SDL_SetVideoMode'
  7. codeC.c:38: undefined reference to `SDL_Quit'
  8. collect2: ld a retourné 1 code d'état d'exécution
  9. gnatlink: error when calling /usr/bin/gcc-4.3
  10. gnatmake: *** link failed.


 
En fait je crois que je ne comprend rien a la compilation.
 
Quelqu'un est il en mesure de m'aider ?  
 
Merci


Message édité par exeed le 13-04-2009 à 21:00:40
Reply

Marsh Posté le 13-04-2009 à 20:56:27   

Reply

Marsh Posté le 13-04-2009 à 23:16:10    

-l<les bibliothèques SDL à inclure> ?

Reply

Marsh Posté le 13-04-2009 à 23:21:30    

mais si il manque des librairies a la compilation du code C, ne devrait il pas y avoir une erreur ?

Message cité 1 fois
Message édité par exeed le 13-04-2009 à 23:23:55
Reply

Marsh Posté le 13-04-2009 à 23:30:23    

bon j'ai trouvé quelque chose,
Si je mets une fonction main (une vraie) et que j'essaye de compiler pour de "vrai" (cad pas juste un fichier objet) ça fonctionne (j'ai un exécutable), cependant si je ne met pas de fonction main ça ne compile pas.  
 
Donc peut être qu'il ne crée pas correctement le fichier objet car bug a la compilation. (pas de main)
 
Qu'en pensez vous ? Que faire ?


Message édité par exeed le 13-04-2009 à 23:46:36
Reply

Marsh Posté le 14-04-2009 à 13:08:52    

exeed a écrit :

mais si il manque des librairies a la compilation du code C, ne devrait il pas y avoir une erreur ?


Non. Par définition, la compilation ne fait pas d'édition de lien, tout ce dont le compilateur a besoin ce sont les fichiers #include pour avoir la définition des symboles.


Message édité par Elmoricq le 14-04-2009 à 13:09:06
Reply

Marsh Posté le 15-04-2009 à 11:42:06    

D'accord et qu'entends tu par les bibliothèques SDL ? Pendant la compilation du C ou de l'Ada ?

Reply

Marsh Posté le 15-04-2009 à 12:08:02    

Les bibliothèques qui contiennent les symboles SDL_* qu'il te manque au link.

 

Par ailleurs, il faut distinguer deux étapes lors de la construction d'un livrable.
En très gros :
1. compilation (génération d'un .o) => transformation d'un code source en objet utilisable par le l'éditeur de lien
2. édition de lien => transforme des objets en binaire compréhensible par l'OS.

 

Lors de la compilation, le compilo se moque de ne pas trouver les symboles, tout ce dont il a besoin c'est de leur définition pour pouvoir construire ses fichiers .o. Ces symboles sont définis dans les fichiers include (les .h)
Par contre, l'éditeur de lien, lui, a besoin de la présence physique des fonctions utilisées : c'est la résolution de noms.
D'où l'utilisation de l'option "-l" pour lui indiquer le ou les bibliothèques à prendre en compte pour l'édition de lien.


Message édité par Elmoricq le 15-04-2009 à 12:08:38
Reply

Marsh Posté le 15-04-2009 à 12:38:48    

Ok merci ça fonctionne.  
 
J'ai d'abord mis cela:  
 

Code :
  1. gnatmake -gnatf essaiAda.adb -cargs -g -largs -lSDL -lSDLmain -g codeC.o


Mais en fait gnatlink ne prenait pas en compte les librairies (surement une erreur d'écriture de ma part) donc j'ai fait pas a pas:

Code :
  1. gnatbind -x essaiAda.ali


puis  

Code :
  1. gnatlink -lSDL -lSDLmain essaiAda.ali -g essaiC.o


 
Voila, merci Elmoricq, je pense que j'aurais bientôt d'autres questions.


Message édité par exeed le 15-04-2009 à 12:39:12
Reply

Marsh Posté le 18-04-2009 à 13:01:48    

Nouvelle question :
 
Est ce possible d'avoir un programme dans lequel du C appelle de l'Ada et de l'Ada appelle du C ?  
 
Le probleme a mon avis se situe (encore) a la compilation.  
Les différentes instructions de compilation pour les deux cas sont a la page 15 et 18 du document suivant :
http://www.cours.polymtl.ca/inf630 [...] l/pres.pdf
 
Est ce possible de mixer les deux ?  
 
Merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed