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. [Linker error] DLL -> undefined reference to `vtable ?
    Par Zenol dans le forum D�buter
    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