Undefined reference

Undefined reference - C - Programmation

Marsh Posté le 08-12-2004 à 23:22:30    

J'ai divisé mon programme en trois partie distinctes:
 
camera.c et son header (capture depuis V4L)
image.c et son header (conversion en PPM)
main.c appelant les fonctions de camera.c
 
Le problème est que lorsque je tente de compiler le tout, j'obtiens le message  
 

Code :
  1. main.o(.text+0x55): In function `main':
  2. : undefined reference to `captureImage'
  3. collect2: ld returned 1 exit status


 
pour la commande  

Code :
  1. cc main.o image.o camera.o -o camapp


 
Ce que je n'arrive pas à saisir c'est qu'avant l'ajout de la fonction "captureImage", le code était compilé sans problèmes. Ce n'est donc peut-être pas un problème d'inclusion... Ce ne peut être non plus l'ordre dans lequel les fichiers sont présentés au compilateur puisque qu'il me semble avoir respecter l'ordre de définition. Et de toutes manières, j'ai tenté toutes les combinaisons en vain...
 
camera.h

Code :
  1. #ifndef CAMERA_H
  2. #define CAMERA_H
  3. #define WIDTH 352
  4. #define HEIGHT 288
  5. #define PALETTE VIDEO_PALETTE_RGB24;
  6. #include <sys/types.h>
  7. #include <sys/stat.h>
  8. #include <sys/ioctl.h>
  9. #include <sys/mman.h>
  10. #include <linux/videodev.h>
  11. #include <fcntl.h>
  12. #include <unistd.h>
  13. #include <errno.h>
  14. #include <stdio.h>
  15. #include <stdlib.h>
  16. void openCam(void);
  17. void closeCam(void);
  18. void printCap(void);
  19. void frambufDetect(void);
  20. void setWin(void);
  21. void setImage(int hue, int colour, int contrast, int brightness, int depth);
  22. void set_buffer(void);
  23. void captureImage(void (*ptrfonction) (unsigned char*), int rep);
  24. ...


 
camera.c

Code :
  1. ...
  2. void captureImage(void (*ptrfonction) (unsigned char*), int rep)
  3. {
  4. int i, nbcapture=1;
  5. image=0;
  6. while(nbcapture<=rep)
  7.         {
  8.         while(i<0){ /*Tant qu'on obtient une erreur, l'appel doit etre repete. */
  9.                     /*On verifie que la fonction a reussi et qu'il n'y a pas eu de signals qui ont interrompu l'appel.*/
  10.         i=ioctl(descrpFichier, VIDIOCSYNC, &image);
  11.         if(i < 0 || errno == EINTR)
  12.         {
  13.         if(i<0)
  14.                 {
  15.                 perror("VIDIOCSYNC" );
  16.                 printf("Le programme doit quitter\n\a" );
  17.                 exit(-1);
  18.                 }
  19.         continue;
  20.         }
  21.         break; /*La sync. s'est bien deroule. On sort de la boucle*/
  22.         }
  23. posImg=ptr+mbuf.offsets[image];
  24. ...


 
main.c

Code :
  1. #include "camera.h"
  2. extern void extractPix(unsigned char* imgbuffer);
  3. int main(void)
  4. {
  5. openCam();
  6. printCap();
  7. frambufDetect();
  8. setWin();
  9. setImage(128,128,128,128,24);
  10. set_buffer();
  11. captureImage(&extractPix, 2);
  12. closeCam();
  13. return 0;
  14. }


 
*La fonction extractPix est définie dans le fichier image.c dont il est inutile de parler ici.
 
Merci pour la lecture. Le projet est en progression...

Reply

Marsh Posté le 08-12-2004 à 23:22:30   

Reply

Marsh Posté le 08-12-2004 à 23:28:05    

Pierre-Luc a écrit :

J'ai divisé mon programme en trois partie distinctes:
 
camera.c et son header (capture depuis V4L)
image.c et son header (conversion en PPM)
main.c appelant les fonctions de camera.c
 
Le problème est que lorsque je tente de compiler le tout, j'obtiens le message  
 

main.o(.text+0x55): In function `main':
: undefined reference to `captureImage'
collect2: ld returned 1 exit status


pour la commande  

cc main.o image.o camera.o -o camapp




Est-tu sûr que les .o ont été recompilés? Montre le makefile complet


Message édité par Emmanuel Delahaye le 08-12-2004 à 23:28:46

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 08-12-2004 à 23:39:32    

un petit -Wall déjà ça ferait pas de mal

Reply

Marsh Posté le 09-12-2004 à 00:10:47    

Emmanuel Delahaye a écrit :

Est-tu sûr que les .o ont été recompilés? Montre le makefile complet


 
Je n'ai pas construit de makefile pour le moment. Je fais simplement un "cc -c" pour chacun des fichiers et que je lie ensuite par "cc -o ...".

Reply

Marsh Posté le 09-12-2004 à 00:12:47    

Taz a écrit :

un petit -Wall déjà ça ferait pas de mal


 
Cette option ne change rien au problème malheureusement...

Reply

Marsh Posté le 09-12-2004 à 04:15:18    

Tu sais que tu peux faire directement "cc -o camapp main.c image.c camera.c" hein. Si tu es sûr d'avoir recompilé camera.c, je vois pas trop... T'aurais pas déclaré la fonction static ?

Reply

Marsh Posté le 09-12-2004 à 08:10:34    

Pierre-Luc a écrit :

Je n'ai pas construit de makefile pour le moment. Je fais simplement un "cc -c" pour chacun des fichiers et que je lie ensuite par "cc -o ...".


Je t'engage à t'y mettre toute affaires cessantes.
 
http://mapage.noos.fr/emdel/codage.htm#organiser


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 10-12-2004 à 00:06:22    

matafan a écrit :

Tu sais que tu peux faire directement "cc -o camapp main.c image.c camera.c" hein.  


 
Je l'ai appris juste après avoir posté mon message.  
 
Pour ce qui est du "static", non, je n'ai rien défini de la sorte. Si certaines personnes souhaitent jetter un coup d'oeil au code source intégral, le voici à cette adresse:
 
http://machivi.ma.cx/pierre-luc/camapp/

Reply

Marsh Posté le 10-12-2004 à 02:30:36    

La source du problème a été fixée. C'était simplement une erreur de fermeture d'accolades qui rendait ma fonction "locale" à l'intérieure de la précédente. En espérant ne plus rencontrer trop d'erreurs du genre encore... Merci du coup de main. En passant, je prévois utiliser un éditeur de texte dédié au C plutôt que simplement VI qui rend le repérage de blocs difficile.

Reply

Marsh Posté le 10-12-2004 à 04:27:09    

Comme vim par exemple :D

Reply

Marsh Posté le 10-12-2004 à 04:27:09   

Reply

Marsh Posté le 10-12-2004 à 08:26:58    

Pierre-Luc a écrit :

La source du problème a été fixée.  


Tu veux dire corrigée (fixed)

Citation :


C'était simplement une erreur de fermeture d'accolades qui rendait ma fonction "locale" à l'intérieure de la précédente.  


En C standard, il n'y a pas de fonction 'locale'. C'est une extension supportée par certains compilateurs. Si tu as gcc, je te conseille de désactiver les extensions :
 
-W -Wall -O2 -ansi et éventuellement -pedantic  
 
si tu cherches à faire du code portable.

Citation :


En espérant ne plus rencontrer trop d'erreurs du genre encore... Merci du coup de main. En passant, je prévois utiliser un éditeur de texte dédié au C plutôt que simplement VI qui rend le repérage de blocs difficile.


J'utilise UltraEdit32. J'y ai incorporé un outil externe (GNU Indent 1.91) qui fait la mise en en forme du code.


Message édité par Emmanuel Delahaye le 10-12-2004 à 08:27:39

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 16-12-2004 à 03:41:59    

Je me suis attardé à reviser le code source du programme en éliminant au passage plusieurs erreurs simples. L'application capture simplement une image sur le dispositif à /dev/video0 et place chacun des pixels à l'intérieur d'un fichier PPM. Évidemment, ce code n'a pas été développé dans ce but précis, mais a plutôt servi à établir les premières étapes de l'organisation d'un projet plus grand. Pour les intéressés, la source est visible à cette adresse:
 
http://machivi.ma.cx/pierre-luc/camapp/
 
Pour compiler, il suffit de faire
gcc -Wall main.c image.c camera.c -o camapp
 
et de lancer l'exécutable avec les droits de super-utilisateur (si l'accès à /dev/video0 lui est réservé).
 
Merci du coup de main.
 
P.S.
 
Si vous n'utilisez pas la Quickcam comme caméra avec le pilote qc-usb, tachez de ne pas omettre de commenter l'appel "system" dans main.c

Reply

Sujets relatifs:

Leave a Replay

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