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 :

Linker error: undefined reference to ..


Sujet :

C++

  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut Linker error: undefined reference to ..
    Bonsoir,
    Lorsque je compile un projet C++ composé de trois fichiers: *.h, *.cpp et main.cpp et qui a été correctement compilé et exécuté lors de sa création, le système me renvoie des linker errors: toutes les méthodes causes des indefined references. Ceci seulement lorsque le projet est relancé après être fermé après sa création (premier lancement après la première ferméture du projet).
    Avez-vous une explication?

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut
    Salut,

    Tu compiles ton programme comment ?
    -makefile perso
    -gmake
    -un environement de developpemment avec compilateur integre

    Pourai je avoir le debut d'un de tes fichiers h ?

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut
    Sincèrement je n'ai pas compris ce que signifie ce que tu as écris après les tirets. Ce que je peux te dire c'est que je crée une nouvelle classe (avec dev-c++ ou bien des nouveaux fichiers h et ccp avec codeblocks), j'écris le code et finalement je fais compiler ou compiler & exécuter.

    Exemple de projet:
    Premier fichier h:
    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
    #ifndef UNEPIECE_H
    #define UNEPIECE_H
    #include <string.h>
     
    class UnePiece
    {
    protected:
    	char *son_nom;
    public:
    	UnePiece (char *tel_ptr)
       {
    	son_nom=new char [strlen(tel_ptr)+1];
    	strcpy(son_nom,tel_ptr);
    	}
     
    	~UnePiece ()
       {
    		delete []son_nom;
    	}
    };
     
    #endif
    Deuxième fichier h:
    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
    #ifndef UNEPIECESIMPLE_H
    #define UNEPIECESIMPLE_H
    #include "UnePiece.h"
    #include <string.h>
     
    class UnePieceSimple: public UnePiece
    {
    private:
       int son_poids;
     
    public:
    	UnePieceSimple(char *tel_ptr ,int tel_pds): UnePiece(tel_ptr),son_poids(tel_pds){}
     
       int donnePoids();
     
       void affiche();
    };
     
     
    class UnePieceComposite: public UnePiece
    {
    private:
        UnePieceSimple **sesComposants; // fin du tableau marquée par 0
     
    public:
    	 UnePieceComposite(char *tel_ptrn , UnePieceSimple **tel_ptrp): UnePiece(tel_ptrn)
        {
          int i,j;
    	   for(i=0; tel_ptrp[i]; i++);
    	   sesComposants = new UnePieceSimple*[i+1];
    	   for (j=0; j<=i; j++)
    	     sesComposants[j]=tel_ptrp[j];
        }
     
    	 int donnePoids();
     
        void affiche();
     
        ~UnePieceComposite ()
    	{
    		delete [] sesComposants;
    	}
    };
    #endif
    Fichier cpp:
    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
    #include "UnePiece.h"
    #include "UnePieceSimple.h"
    #include <iostream>
    using namespace std;
    #include <string.h>
     
    int UnePieceSimple::donnePoids(){return son_poids;}
    void UnePieceSimple::affiche(){cout << son_nom << endl;}
     
     
    int UnePieceComposite::donnePoids()
    {
    	int som=0,i=0;
    	while(sesComposants[i] != NULL)
       {
    		som+=sesComposants[i]->donnePoids();
    		i++;
    	}
    	return som;
    }
     
     
    void UnePieceComposite::affiche()
    {
       int i=0;
    	cout << son_nom <<":"<< endl;
    	while(sesComposants[i] != 0)
       {
    		cout << "\t";
    		sesComposants[i]->affiche();
    		i++;
    	}
    }
    Fichier main.cpp:
    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
    #include "UnePiece.h"
    #include "UnePieceSimple.h"
    #include <iostream>
    using namespace std;
    #include <string.h>
     
    int const MAX_COMPOSANTS=11;
     
    int main ()
    {
    	UnePieceSimple la_s1("ecrou",20);
    	UnePieceSimple la_s2=la_s1, la_s3=la_s1;
    	UnePieceSimple la_s4("vis",15);
    	UnePieceSimple la_s5=la_s4, la_s6=la_s4;
    	UnePieceSimple la_s7("plaque",200);
    	UnePieceSimple *telComposants[MAX_COMPOSANTS]=
       {&la_s1,&la_s2,&la_s3,&la_s4,&la_s5,&la_s6,&la_s7,NULL};
     
    	UnePieceComposite la_c1("appareil",telComposants);
     
    	la_c1.affiche();
    	cout<<"son poids est:"<<la_c1.donnePoids()<<endl;
     
    	system("PAUSE");
    	return 0;
    }
    Les messages d'erreur sont:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     C:\Users\user\AppData\Local\Temp\cciYbaaa.o(.text+0x2a7) In function `main': 
     C:\Users\user\AppData\Local\Temp\cciYbaaa.o(.text+0x2a7) In function `main':  [Linker error] undefined reference to `UnePieceComposite::affiche()'  
     C:\Users\user\AppData\Local\Temp\cciYbaaa.o(.text+0x2a7) In function `main':  [Linker error] undefined reference to `UnePieceComposite::donnePoids()' 
     C:\Users\user\AppData\Local\Temp\cciYbaaa.o(.text+0x2a7) ld returned 1 exit status
    Et je suis sous vista.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    La question d'okaido peut être reformulé ainsi : comment lances-tu ta compilation ? A partir de Code::Block (1) ? A partir de Dev-C++ (2) ? A la main (3).
    Je pense qu'il doit s'agir de (1) ou (2). Visiblement, le fichier Fichier cpp n'est pas inclus dans le projet et n'est donc pas compilé.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Attention: La classe UnePiece doit soit avoir un constructeur de copie et un opérateur d'affectation correctement définis, soit être non-copiable et non-assignable.

    ...sinon, tu cours droit au crash.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut
    Le fichier cpp est inclu dans le projet. Peux-tu m'expliquer ce que tu entends, 3DArchi, par n'est pas inclu? Si cela était vrai le projet n'aurait pas été compilé la première fois après sa création.

    Médinoc, peux-tu me montrer l'erreur? Je n'ai pas fait un constructeur par copie et je ne vois pas d'erreur.

  7. #7
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Très simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int main(void)
    {
    	UnePiece obj1("toto");
    	{
    		UnePiece obj2(obj1); //Copie triviale
    		//Les deux ont le même pointeur
    	} //Le pointeur est deleté
    	return 0;
    }//Le pointeur est deleté de nouveau --> Erreur
    La règle d'or, c'est que si une classe possède un destructeur non-trivial (ici, le destructeur fait un delete d'une variable membre), la classe doit soit être non-copiable, soit avoir un constructeur de copie non-trivial.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par yo_haha Voir le message
    Le fichier cpp est inclu dans le projet. Peux-tu m'expliquer ce que tu entends, 3DArchi, par n'est pas inclu? Si cela était vrai le projet n'aurait pas été compilé la première fois après sa création.
    Il a compilé main.cpp mais pas UnePieceSimple.cpp

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut
    D'accord avec 3Darchi.
    Je sais qu'avec une ancienne version de dev c++ j'avais des problemes de mise a jour il y a 2 ans. j'etais oblige de suprimer mon projet et le recree pour qu'il prenne en compte certaint fichiers sources. Mais je n'ai plus eu sce probleme avec la version suivant.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par ---okaido--- Voir le message
    D'accord avec 3Darchi.
    Je sais qu'avec une ancienne version de dev c++ j'avais des problemes de mise a jour il y a 2 ans. j'etais oblige de suprimer mon projet et le recree pour qu'il prenne en compte certaint fichiers sources. Mais je n'ai plus eu sce probleme avec la version suivant.
    D'une façon plus globale, on recommande d'utiliser un autre I.D.E. (par exemple Code::Block); dev-c++ n'étant plus maintenu, il contient encore quelques bugs assez gênants.

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 45
    Par défaut
    Je ne le savait pas. merci de l'info.
    De toute facon je suis sur eclipse et je compile avec mes propres makefile donc plus de problemes

  12. #12
    Membre éclairé
    Inscrit en
    Novembre 2008
    Messages
    308
    Détails du profil
    Informations forums :
    Inscription : Novembre 2008
    Messages : 308
    Par défaut
    Je suis vraiment désolé mais je reste encore sans rien comprendre!
    Médinoc, pourquoi as-tu ouvert une accolade après la déclaration de la variable? Qu'est-ce que ça veut dire?

    3DArchi, quelle solution proposes-tu pour éviter les linker errors? Pourquoi UnePieceSimple.cpp n'est pas inclu dans le projet alors que ce fichier a été créé normalement dans le projet? Même avec CodesBlocks j'ai les mêmes erreurs.

  13. #13
    Membre émérite
    Inscrit en
    Juillet 2005
    Messages
    512
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 512
    Par défaut
    Sous code blocks, dans la fenetre Project tu doit avoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Workspace
        |
         ---- NomProjet
                 |
                  ---- Sources
                          |
                           ---- main.cpp
                          |
                           ---- fichier.cpp (celui ou sont définie tes fonctions)

  14. #14
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Citation Envoyé par yo_haha Voir le message
    Je suis vraiment désolé mais je reste encore sans rien comprendre!
    Médinoc, pourquoi as-tu ouvert une accolade après la déclaration de la variable? Qu'est-ce que ça veut dire?
    J'ai juste ouvert un autre bloc dans la fonction pour bien séparer les variables.
    Si ça t'aide à comprendre, tu peux imaginer qu'il y a un if(true) devant le bloc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/06/2007, 12h34
  2. [Linker error] undefined reference to ..
    Par lichman dans le forum C++
    Réponses: 5
    Dernier message: 15/01/2007, 16h50
  3. Réponses: 1
    Dernier message: 14/11/2006, 11h12
  4. [Linker error] undefined reference to...
    Par z980x dans le forum C++
    Réponses: 4
    Dernier message: 05/03/2006, 15h30
  5. [Linker error] undefined reference to 'IcmpSendEcho@'
    Par Xevious dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 29/12/2005, 16h45

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