IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Problème lors de l'#include de header (undefined reference)


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Problème lors de l'#include de header (undefined reference)
    Bonjour tout le monde,

    Voilà je débute en C (avec Code::Blocks, sous windows, utilisant gcc) et je suis en pleine écriture de mon premier programme modulaire. Et à cette occasion je me rend compte que je n'ai probablement pas compris comment fonctionnait les header... (malgré qqs lectures qui me semblaint avisées.....)

    En effet jusque là je faisait des #include "header.h" au début de mes fichiers d'instructions, le header contenant les prototypes des fonctions qui seront utilisées dans le code en cours d'écriture, les fonctions étant définies dans le fichier .c correspondant au .h.
    J'avais cru comprendre qu'il suffisait d'inclure le .h et qu'après le linker se débrouillait pour combiner les .c et ainsi inclure toutes les fonctions au sein du programme .exe final.

    Mais voilà-t-y pas que, maintenant mes fonctions écrites, je m'attaque au main.c et fait donc pour la première fois appel a des fonctions situées dans un autre .c. Et là cata-schtroumpf, à chaque appel de fonction le compilo me renvoi l'erreur undefined reference to 'fonction()', qu'il semble pourtant bien connaitre puisqu'il y adjoint la liste correcte des arguments entre les parenthèses.
    Et le problème semble se résoudre si j'#include à la main le fichier .c contenant les fonctions proprement dites, en plus du .h...

    Inclure le .h ne suffit donc t-il pas?

  2. #2
    Membre éclairé
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Points : 750
    Points
    750
    Par défaut
    Citation Envoyé par Nival Voir le message
    Inclure le .h ne suffit donc t-il pas?
    Non. Il faut ajouter les objets (.o) ou libraires (.so/.a) qui implémentes ces fonctions.
    En gros le .h sert juste à donner la signature, il faut ensuite dire au linker où trouver ces fonctions.

    Le tuto sur les makefile peut te donner des pistes (http://gl.developpez.com/tutoriel/outil/makefile/)

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Oula, ça me semble bien compliqué... Je pensais qu'un IDE comme Code::Blocks se chargeait de linker tout seul les fichiers, une fois ceux-ci intégrés au projet.

    Bon, je crois que je vais tout simplement #include tous les .c dans le main.c! (en attendant de comprendre comment procéder de façon plus "propre")

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    Points : 110
    Points
    110
    Par défaut
    main.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include "foo.h"
     
    int     main(void)
    {
      foo();
      return (0);
    }
    foo.c :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include "foo.h"
     
    void    foo(void)
    {
      printf("Hello world!\n");
    }
    foo.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef __FOO_H__
    # define __FOO_H__
     
    void    foo(void);
     
    #endif

    Comment compiler avec gcc (je ne precise pas de flag de compilation, refere toi a la documentation de gcc) ?

    gcc -o output main.c foo.c

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par Nival Voir le message
    Oula, ça me semble bien compliqué... Je pensais qu'un IDE comme Code::Blocks se chargeait de linker tout seul les fichiers, une fois ceux-ci intégrés au projet.
    C'est bien le cas, si tu utilises Code::blocks pour développer et compiler, il suffit de rajouter les fichiers sources (.c) au projet.

    Citation Envoyé par Nival Voir le message
    Bon, je crois que je vais tout simplement #include tous les .c dans le main.c! (en attendant de comprendre comment procéder de façon plus "propre")
    Très mauvaise méthode.

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Nival Voir le message
    Voilà je débute en C (avec Code::Blocks, sous windows, utilisant gcc) et je suis en pleine écriture de mon premier programme modulaire. Et à cette occasion je me rend compte que je n'ai probablement pas compris comment fonctionnait les header... (malgré qqs lectures qui me semblaint avisées.....)

    <...>

    Inclure le .h ne suffit donc t-il pas?
    Non.

    http://video.google.fr/videoplay?doc...17817010204120
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Tusbar Voir le message
    foo.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef __FOO_H__
    # define __FOO_H__
     
    void    foo(void);
     
    #endif
    Attention, les identificateurs commençant par _ sont réservés à l'implémentation. Je recommande :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef H_FOO
    #define H_FOO
     
    void    foo(void);
     
    #endif
    http://emmanuel-delahaye.developpez.com/codage.htm
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par gl Voir le message
    Très mauvaise méthode.
    Je m'en doute bien, mais bon ça avait l'avantage de marcher!

    Enfin, maintenant que j'ai #include chaque .h en tête du .c correspondant (comme indiqué par Tusbar ) tout semble marcher, donc pour l'instant j'abandonne mes #include sauvages...
    Merci en tout cas pour toutes ces réponses rapides et pertinentes!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/06/2011, 12h20
  2. [VC++] Problème include de header
    Par Yellowmat dans le forum MFC
    Réponses: 10
    Dernier message: 08/12/2005, 13h50
  3. Problème lors du EXTEND d'un tableau
    Par banana31 dans le forum Oracle
    Réponses: 14
    Dernier message: 10/02/2004, 10h58
  4. Problème lors du chargement
    Par carlito dans le forum Flash
    Réponses: 26
    Dernier message: 06/01/2004, 15h21
  5. Réponses: 2
    Dernier message: 17/08/2003, 20h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo