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 :

[Pb ~classique] undefined reference to ... dans le linker


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut [Pb ~classique] undefined reference to ... dans le linker
    Bonjour,

    Je ne trouve pas exactement le meme problème dans les anciens messages, alors je pose ma question.

    J'obtiens le message suivant:

    nom_du_fichier.o [place en hexadécimal dans le fichier] linker error: undefined reference to nom_d'une_fonction_de_la_classe_Term_appelée_dans_PolPlusVar.

    ..et ça me fait ça pour chaque fonction de Term.cpp appelée dans PolPlusVar.cpp (non, je n'ai pas oublié d'include )

    en utilisant ce makefile sous unix:

    CXX=g++
    CXXFLAGS=-Wall
    LDFLAGS=-Wall
    EXEC1=Test

    all: $(EXEC1)

    Test: Test.o PolPlusVar.o Term.o
    $(CXX) -o $@ $^ $(LDFLAGS)

    %.o: %.cpp
    $(CXX) -o $@ -c $< $(CXXFLAGS)

    clean:
    rm -f $(EXEC1) *.o

    et les deux classes suivantes: PolPlusVar, Term ainsi qu'un fichier de test Test.cpp

    Merci d'avance!
    Benjamin.

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    A mon avis ce serait une fonction que tu n'as pas défini, ou un problème avec une fonction template.

    Essaye aussi de compiler le programme à la main, pour t'assurer que ça ne vienne pas de ton Makefile.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    j'ai vérifié 15 fois que j'avais bien défini toutes mes fonctions, ce n'est pas le pb; et il n'y a pas de fonctions template (d'ailleurs je ne sais pas encore ce que c'est ). Donc je me dis que le pb vient du makefile.

    Ceci dit j'ai juste bidouillé le makefile fait par les enseignants pour un autre TP, donc s'il y a dans le coin un expert en makefile ce serait sympa de me dire quelle option utiliser (ou pas..). Merci!

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Je viens de tester ton makefile, apparament il fonctionne.

    Essaye de compiler sans passer par le Makefile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    g++ -Wall Test.cpp Term.cpp PolPlusVar.cpp -o Test

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    ok merci j'essayerai ça à 15h30 (g cours là, pas le temps )

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    même problème avec la compilation manuelle que tu m'as donnée...
    Heeeeeeeeeeeeeelp!!

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Décembre 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Décembre 2005
    Messages : 109
    Par défaut
    Citation Envoyé par Chewbi
    même problème avec la compilation manuelle que tu m'as donnée...
    Heeeeeeeeeeeeeelp!!
    Il doit bien manquer une définition quelque part donc ...
    Ca ne venait pas du Makefile mais de tes fichiers sources. On ne peut pas t'aider plus sans en connaitre le contenu.

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut
    un échantillon de source en bug (j'ai viré des fonctions, du coup il n'y a pas beaucoup d'erreur de liens; mais si on les corrige sur cet exemple, tout le prog marchera ) :

    [[ Edit: bien sur les .cpp et .h sont dans des fichiers séparés; je les ai regroupés ici pour plus de compacité]]

    classe Term:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
     
    #ifndef _Term
    #define _Term
     
    #include <cstdlib>
    #include <vector>
    typedef int Gen;
     
    class Term {
    public:
     
          Term();
     
          // prend un tableau d'entiers en paramètre, que l'on transforme en vecteur
         Term(Gen coeff, int* tab_indet, int size) ;
     
          // acces au coefficient
          Gen getCoeff();       
     
          // destructeur
          ~Term();      
     
    private:        
     
          Gen coeff;
          std::vector<int> indet;    
    };
    #endif
     
    #include <cstdlib>
    #include <vector>
    #include <iostream>
    #include "Term.h"
     
          inline Term::Term() {}
     
         // prend un tableau d'entiers en paramètre, que l'on transforme en vecteur
         Term::Term(Gen coeff, int* tab_indet, int size) { // size est la taille du tableau: n
                this->coeff=coeff;
                for (int i=0; i<size; i++) 
                    indet.push_back(*(tab_indet+i));
          }
     
          inline Gen Term::getCoeff() {
                return coeff;
          }
     
          // destructeur
          Term::~Term() {}
    Classe PolPlusVar:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
     
     
    #ifndef _PolPlusVar
    #define _PolPlusVar
     
    #include <cstdlib>
    #include <vector>
    #include "Term.h"
     
    #define NB_INDET 2;
     
    class Term;
     
    class PolPlusVar {
     
    public:
     
           // constructeur vide
           PolPlusVar();
     
           // fonction stupide(sur l'échantillon!)  juste pour faire planter le linker
           void addTerm(Term term);
     
           // destructeur
           ~PolPlusVar();
     
           // n est le nombre d'indéterminées utilisées pour le calcul
           static const int n=NB_INDET;
     
    private:
     
           // tabTermes est un tableau de vecteurs, représentant chacun un terme
           std::vector<Term> tabTermes;        
    };
    #endif
     
    #include <cstdlib>
    #include <vector>
    #include <iostream>
    #include "Term.h"
    #include "PolPlusVar.h"
     
           // constructeur vide
           inline PolPlusVar::PolPlusVar() {}
     
           // fonction qui plante (parmi d'autres bien sur)
           void PolPlusVar::addTerm(Term term) {       
            if (term.getCoeff()!=0)  {}  }
     
           // destructeur
           PolPlusVar::~PolPlusVar() {}
    Fichier de test:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     
    #include "PolPlusVar.h"
    #include "Term.h"
    #include <iostream>
     
    int main(int argc, char **argv) {}
    Ce petit programme ne fonctionne pas :-/
    Au passage, le message d'erreur:

    [auderb@ensibull tmpp]$ make
    g++ -o PolPlusVar.o -c PolPlusVar.cpp -Wall
    g++ -o Term.o -c Term.cpp -Wall
    g++ -o Test Test.o PolPlusVar.o Term.o -Wall
    PolPlusVar.o(.text+0x32): In function `PolPlusVar::addTerm(Term)':
    : undefined reference to `Term::getCoeff()'
    collect2: ld returned 1 exit status
    make: *** [Test] Error 1

    Je commence à désespérer

  9. #9
    Membre chevronné
    Avatar de bigquick
    Profil pro
    Inscrit en
    Août 2002
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 356
    Par défaut
    Salut,

    ton problème vient de l'utilisation du mot clé "inline". Regarde ici, tout est expliqué : FAQ C++ : Inline

    Il est habituellement impératif que la définition de la fonction (la partie entre {... }) soit placée dans un fichier d'en-tête. Si vous mettiez inline la définition d'une fonction dans un fichier d'implémentation cpp, et si cette fonction était appelée d'un autre fichier cpp, vous obtiendriez "une erreur externe" (fonction non définie) au moment de l'édition de liens.
    Voilà, ca devrait aller mieux

  10. #10
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Les fonctions inline doivent etre definies dans chaque unite qui en fait usage. Donc tu les mets dans un entete ou tu ne les mets pas inline.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Février 2006
    Messages : 63
    Par défaut


    Mici bcp!

    Chewbaka, content

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 14/11/2006, 11h12
  2. [Linker error] undefined reference to...
    Par z980x dans le forum C++
    Réponses: 4
    Dernier message: 05/03/2006, 15h30
  3. [Linker error] undefined reference to 'IcmpSendEcho@'
    Par Xevious dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 29/12/2005, 16h45
  4. Réponses: 17
    Dernier message: 25/10/2005, 10h09

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