Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
3036 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Undefined reference

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Undefined reference

n°918456
Pierre-Luc
Posté le 08-12-2004 à 23:22:30  profilanswer
 

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...

mood
Publicité
Posté le 08-12-2004 à 23:22:30  profilanswer
 

n°918463
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-12-2004 à 23:28:05  profilanswer
 

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/
n°918482
Taz
bisounours-codeur
Posté le 08-12-2004 à 23:39:32  profilanswer
 

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

n°918495
Pierre-Luc
Posté le 09-12-2004 à 00:10:47  profilanswer
 

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 ...".

n°918496
Pierre-Luc
Posté le 09-12-2004 à 00:12:47  profilanswer
 

Taz a écrit :

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


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

n°918542
matafan
Posté le 09-12-2004 à 04:15:18  profilanswer
 

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 ?

n°918549
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-12-2004 à 08:10:34  profilanswer
 

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/
n°919301
Pierre-Luc
Posté le 10-12-2004 à 00:06:22  profilanswer
 

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/

n°919332
Pierre-Luc
Posté le 10-12-2004 à 02:30:36  profilanswer
 

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.

n°919339
matafan
Posté le 10-12-2004 à 04:27:09  profilanswer
 

Comme vim par exemple :D

mood
Publicité
Posté le 10-12-2004 à 04:27:09  profilanswer
 

n°919347
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-12-2004 à 08:26:58  profilanswer
 

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/
n°924719
Pierre-Luc
Posté le 16-12-2004 à 03:41:59  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Undefined reference

 

Sujets relatifs
[ocaml] Référence à un object Null ?[C#] Garder une référence vers une variable d'une autre classe ?
Question tout bête de passage par référence[PHP] Notice: Undefined variable: xxx in yyy on line zzz
undefined reference avec DEV c++undefined reference to 'fork'
HELP : DEV C++ [ Linker error ] : undefined reference to 'WinMain@16'undefined reference [C++]
undefined reference[DJGPP] J'ai jamais vu ca!! (undefined reference)
Plus de sujets relatifs à : Undefined reference


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR