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 :

Undefined reference to


Sujet :

C++

  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut Undefined reference to
    Bonjour a tous j'apprend le C++, et j'en suis au debut des classes.

    J'ai un probleme que je n'arrive pas a resoudre : Undefined reference to ... avec toutes les lignes du main.


    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
    #include <string>
     
    class Personnage
    {
        public: //Type public
     
        Personnage(); // Le constructeur ( par defaut) qui doit toujours avoir le meme nom que la classe, n'a pas de type de retour
        //Les prototypes methode toujours sans la classe
        Personnage(std::string nomArme, int degatsArme);
     
        void recevoirDegats(int nbDegats);
        void attaquer(Personnage &cible);
        void boirePotionDeVie(int quantitePotion);
        void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
        bool estVivant() const;
        void afficherEtat() const;
     
        private://Mettre toujours Privates les attribut (= variables)
     
        int m_vie;
        int m_mana;
        std::string m_nomArme; //Pas de using namespace std, il faut donc mettrestd:: devant string
        int m_degatsArme;
    };
    #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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    #include "Personnage.h" // Ne pas oublier
    using namespace std;
     
    Personnage::Personnage() : m_vie(100), m_mana(100), m_nom("Epée rouillée"), m_degatsArme(10);//Le constructeur (par defaut),( avec liste d'initialisation) qui initialise les attributs, le main peut desormais utiliser l'objet Personnage
    {
      //Rien mettre dans le corps du constructeur, tout a deja ete fait
    }
     
    //Autre constructeur
    Personnage::Personnage(string nomArme, int degatsArme) : m_vie(100),m_mana(100),m_nomArme(nomArme), m_degatsArme(degatsArme)
    {
     
    }
     
     
    void Personnage::recevoirDegats(int nbDegats)
    {
        m_vie -= nbDegats;
        //On enlève le nombre de dégâts reçus à la vie du personnage
        if (m_vie < 0) //Pour éviter d'avoir une vie négative
        {
            m_vie = 0; //On met la vie à 0 (cela veut dire mort)
        }
    }
    void Personnage::attaquer(Personnage &cible)
    {
        cible.recevoirDegats(m_degatsArme);
        //On inflige à la cible les dégâts que cause notre arme
    }
    void Personnage::boirePotionDeVie(int quantitePotion)
    {
        m_vie += quantitePotion;
        if (m_vie > 100) //Interdiction de dépasser 100 de vie
        {
            m_vie = 100;
        }
    }
    void Personnage::changerArme(string nomNouvelleArme, int
    degatsNouvelleArme)
    {
        m_nomArme = nomNouvelleArme;
        m_degatsArme = degatsNouvelleArme;
    }
    bool Personnage::estVivant() const
    {
        if (m_vie > 0) // Plus de 0 de vie ?
        {
            return true; //VRAI, il est vivant !
        }
        else
        {
            return false; //FAUX, il n'est plus vivant !
        }
    }
    void Personnage::afficherEtat()
    {
        cout <<"Vie : " << m_vie << endl;
        cout << "Mana : " << m_mana << endl;
        m_arme.afficher();
    }

    Fichier main :

    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
    #include <iostream>
    #include "Personnage.h" //Ne pas oublier
    using namespace std;
    int main()
    {
        //Création des personnages
        Personnage david, goliath("Épée aiguisée", 20);
     
        //Au combat !
        goliath.attaquer(david);
        david.boirePotionDeVie(20);
        goliath.attaquer(david);
        david.attaquer(goliath);
        goliath.changerArme("Double hache tranchante vénéneuse de la mort", 40);
        goliath.attaquer(david);
     
        //Temps mort ! Voyons voir la vie de chacun…
        cout << "David" << endl;
        david.afficherEtat();
        cout << endl << "Goliath" << endl;
        goliath.afficherEtat();
     
        return 0;
    }

    Ma version de code block est 12.11



    Merci a tous pour votre aide.

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Pour comprendre une telle erreur, il faut comprendre ce que dis le compilateur:

    linkage error: undefined error to ...
    Première information importante, c'est une erreur d'édition de liens (linkage), pas de compilation en soit.

    A priori, c'est parce que tu n'as pas fourni à l'éditeur de liens l'ensemble des morceaux dont il a besoin.
    L'une des raisons, c'est parce que tu n'aurais pas indiqué qu'il faut utiliser certaines bibliothèques (avec des options comme -lbidule pour libbidule (pour gcc) ) ou le chemin ou les trouver (option -L pour gcc).
    L'autre raison posssible, c'est que tu n'as pas indiqué qu'un de tes .cpp fait partie des fichiers à compiler.

    Je penche pour cette dernière solution.
    Régénère le projet, ca peut venir d'une compilation partielle mal faite.
    Le bouton peut s'appeler: régénérer, reconstruire, recompiler, nettoyer et compiler, ou en anglais rebuild, clean and build.

    Si ca ne répare pas, cherche une commande pour dire qu'un fichier fait partie des codes sources. Au pire, retire le fichier du projet, puis ré-ajoute-le (n'aie crainte de le supprimer, il y a une demande pour savoir si tu veux le supprimer ou le retirer)

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    Citation Envoyé par leternel Voir le message
    Pour comprendre une telle erreur, il faut comprendre ce que dis le compilateur:



    Première information importante, c'est une erreur d'édition de liens (linkage), pas de compilation en soit.
    Bonjour Leternel, et merci pour ton aide.

    Citation Envoyé par leternel Voir le message
    A priori, c'est parce que tu n'as pas fourni à l'éditeur de liens l'ensemble des morceaux dont il a besoin.
    L'une des raisons, c'est parce que tu n'aurais pas indiqué qu'il faut utiliser certaines bibliothèques (avec des options comme -lbidule pour libbidule (pour gcc) ) ou le chemin ou les trouver (option -L pour gcc).
    Je suis en train de faire le tuto du SDZ, donc je pense pas que ca vienne de ca, je n'ai pas vu de librairie, de ce genre.



    Citation Envoyé par leternel Voir le message
    L'autre raison posssible, c'est que tu n'as pas indiqué qu'un de tes .cpp fait partie des fichiers à compiler.

    Je penche pour cette dernière solution.
    C'est ce que je pense aussi.




    Citation Envoyé par leternel Voir le message
    Régénère le projet, ca peut venir d'une compilation partielle mal faite.
    Le bouton peut s'appeler: régénérer, reconstruire, recompiler, nettoyer et compiler, ou en anglais rebuild, clean and build.
    Je l'ai fait a plusieurs reprise, toujours rien de nouveau.

    Citation Envoyé par leternel Voir le message
    Si ca ne répare pas, cherche une commande pour dire qu'un fichier fait partie des codes sources. Au pire, retire le fichier du projet, puis ré-ajoute-le (n'aie crainte de le supprimer, il y a une demande pour savoir si tu veux le supprimer ou le retirer)
    Je ne sais pas quelle commande utiliser...
    Lorsque je retire un de ces fichiers, c'est toujours pareil.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Sur Code::Blocks il suffit pourtant d'ajouter le cpp à ton projet, il se charge de compiler tous les .cpp et les lier correctement.
    Peut-on avoir l'erreur complète ? Undefined reference to... quoi ?! c'est bête, à 1 mot près on avait une piste.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre actif Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Par défaut
    Ce qu'il ta été dit avant n'est absolument pas faux, mais n'est cependant pas adapté à ta situation. J'ai repris ton code (sous visual studio) et y ai trouvé plusieurs erreurs de syntaxe, je te le met ci-dessous.

    Chez moi cela compile sans problème après avoir régler les erreurs.

    personnage.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
    #include <string>
     
    class Personnage
    {
    public: //Type public
     
    	Personnage(); // Le constructeur ( par defaut) qui doit toujours avoir le meme nom que la classe, n'a pas de type de retour
    				  //Les prototypes methode toujours sans la classe
    	Personnage(std::string nomArme, int degatsArme);
     
    	void recevoirDegats(int nbDegats);
    	void attaquer(Personnage &cible);
    	void boirePotionDeVie(int quantitePotion);
    	void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
    	bool estVivant() const;
    	void afficherEtat();
     
    private://Mettre toujours Privates les attribut (= variables)
     
    	int m_vie;
    	int m_mana;
    	std::string m_nomArme; //Pas de using namespace std, il faut donc mettrestd:: devant string
    	int m_degatsArme;
    };
    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
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    #include <iostream>
    #include "Personnage.h" // Ne pas oublier
     
    using namespace std;
     
    //Personnage::Personnage() : m_vie(100), m_mana(100), m_nom("Epée rouillée"), m_degatsArme(10);//Le constructeur (par defaut),( avec liste d'initialisation) qui initialise les attributs, le main peut desormais utiliser l'objet Personnage
    Personnage::Personnage() : m_vie(100), m_mana(100), m_nomArme("Epée rouillée"), m_degatsArme(10)//Le constructeur (par defaut),( avec liste d'initialisation) qui initialise les attributs, le main peut desormais utiliser l'objet Personnage
    {
    	//Rien mettre dans le corps du constructeur, tout a deja ete fait
    }
     
    //Autre constructeur
    Personnage::Personnage(string nomArme, int degatsArme) : m_vie(100), m_mana(100), m_nomArme(nomArme), m_degatsArme(degatsArme)
    {
     
    }
     
     
    void Personnage::recevoirDegats(int nbDegats)
    {
    	m_vie -= nbDegats;
    	//On enlève le nombre de dégâts reçus à la vie du personnage
    	if (m_vie < 0) //Pour éviter d'avoir une vie négative
    	{
    		m_vie = 0; //On met la vie à 0 (cela veut dire mort)
    	}
    }
    void Personnage::attaquer(Personnage &cible)
    {
    	cible.recevoirDegats(m_degatsArme);
    	//On inflige à la cible les dégâts que cause notre arme
    }
    void Personnage::boirePotionDeVie(int quantitePotion)
    {
    	m_vie += quantitePotion;
    	if (m_vie > 100) //Interdiction de dépasser 100 de vie
    	{
    		m_vie = 100;
    	}
    }
    void Personnage::changerArme(string nomNouvelleArme, int
    	degatsNouvelleArme)
    {
    	m_nomArme = nomNouvelleArme;
    	m_degatsArme = degatsNouvelleArme;
    }
    bool Personnage::estVivant() const
    {
    	if (m_vie > 0) // Plus de 0 de vie ?
    	{
    		return true; //VRAI, il est vivant !
    	}
    	else
    	{
    		return false; //FAUX, il n'est plus vivant !
    	}
    }
     
    void Personnage::afficherEtat()
    {
    	cout << "Vie : " << m_vie << endl;
    	cout << "Mana : " << m_mana << endl;
    	cout << "Arme : " << m_nomArme << endl;
    	//m_arme.afficher();
    je t'invite à comparer instruction par instruction les différences.

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    Je vois ca et je reviens.

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Sur Code::Blocks il suffit pourtant d'ajouter le cpp à ton projet, il se charge de compiler tous les .cpp et les lier correctement.
    Peut-on avoir l'erreur complète ? Undefined reference to... quoi ?! c'est bête, à 1 mot près on avait une piste.
    Désolé, j'avais lu un peu vite :
    voila , undefined reference to 'Personnage:: ( toutes les methodes...de la classe Personnage)

  8. #8
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    J'ai vu que j'avais oublié cette ligne : #include <iostream> dans les deux fichiers

    J'ai modifié la derniere ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void Personnage::afficherEtat()
    {
        cout <<"Vie : " << m_vie << endl;
        cout << "Mana : " << m_mana << endl;
        cout <<"Arme : " <<m_Arme << endl;
        //m_arme.afficher(); // Ici modifié
    }

    Mais rien de changé.

  9. #9
    Membre actif Avatar de EliXirr
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Avril 2013
    Messages : 62
    Par défaut
    il y avait aussi un ";" mal placé, des noms de variables erronés et un "const" intempestif.

    Mais sinon ça marche chez toi maintenant ?

  10. #10
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    Toujours pareil.


    Je vais voir avec un programmeur que je connais. Je lui tout le programme, ca sera plus commode.

    Merci pour votre aide et votre patience, bonne soirée.

  11. #11
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    Billets dans le blog
    4
    Par défaut
    Bah typiquement ton fichier cpp qui implémente les fonctions de Personnage n'est pas compilé et lié à l'exe.
    Maintenant, est-ce que ce sont les seules erreurs ? Parce que s'il traine une erreur de ; quelque part et que la seule erreur que tu donnes est la 50° d'une liste..
    Les erreurs doivent être traitées (dans 99% des cas) de la première à la dernière. Souvent les suivantes ne sont que parce que le compilo a perdu la tête sur la première, typique avec les {} mal fermées etc
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  12. #12
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Décembre 2012
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Secteur : Distribution

    Informations forums :
    Inscription : Décembre 2012
    Messages : 253
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Bah typiquement ton fichier cpp qui implémente les fonctions de Personnage n'est pas compilé et lié à l'exe.
    Maintenant, est-ce que ce sont les seules erreurs ? Parce que s'il traine une erreur de ; quelque part et que la seule erreur que tu donnes est la 50° d'une liste..
    Les erreurs doivent être traitées (dans 99% des cas) de la première à la dernière. Souvent les suivantes ne sont que parce que le compilo a perdu la tête sur la première, typique avec les {} mal fermées etc
    J'ai fait un copier coller des codes de Elixirr, pour verifier et toujours la meme chose.

    Chez lui ca marche et pas chez moi.

  13. #13
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Alors refais ton projet.
    C'est à dire:
    1. crée un nouveau projet,
    2. copie dedans tes fichiers (en dehors de l'EDI: donc en ligne de commande ou via ton gestionnaire de fichier),
    3. importe dans l'EDI tous les fichiers,
    4. compile.

Discussions similaires

  1. winsock.h : undefined reference...
    Par abraxas dans le forum Dev-C++
    Réponses: 14
    Dernier message: 06/08/2012, 13h42
  2. Undefined reference compilation réseau
    Par Ren97 dans le forum Dev-C++
    Réponses: 11
    Dernier message: 08/03/2005, 09h46
  3. Compilation de xmms : undefined reference to...
    Par Michaël dans le forum Applications et environnements graphiques
    Réponses: 4
    Dernier message: 04/02/2005, 19h05
  4. undefined reference to `xmlParseFile'
    Par Clemaster dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 25/06/2004, 20h38
  5. g++ : undefined reference to ...
    Par le_barbu dans le forum Autres éditeurs
    Réponses: 16
    Dernier message: 14/05/2004, 07h23

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