Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème "undefined reference to" sur Code::Blocks

problème avec les classes

Sujet résolu
    15 novembre 2017 à 1:44:00

    bonjour,

    je suis actuellement le cours de programmation en C++ sur OpenClassrooms et j'en suis à la partie POO, plus particulièrement à la partie "Les Classes" où je suis face à un problème. J'ai voulu tester mon programme 'Personnage' mais lors de la compilation, mon IDE m'informe :

    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::Personnage()'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::Personnage()'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::attaquer(Personnage&)'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::boirePotionDeVie(int)'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::attaquer(Personnage&)'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::attaquer(Personnage&)'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::changerArme(std::string, int)'|
    D:\C++\Personnage\main.o:main.cpp|| undefined reference to `Personnage::attaquer(Personnage&)'|
                                     ||error: ld returned 1 exit status|
                                     ||=== Build failed: 9 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

    Je vous montre ce que contient mes différents fichiers.

    Mon fichier main.cpp :

          #include <iostream>
          #include "Personnage.h"
          using namespace std;
    
          int main()
          {
                Personnage goliath, david;
                //Création de 2 objets de type
                //Personnage : Goliath et david
    
                goliath.attaquer(david);
                david.boirePotionDeVie(20);
                goliath.attaquer(david);
                david.attaquer(goliath);
    
                goliath.changerArme("L'epee du roi",40);
                goliath.attaquer(david);
                return 0;
           }

     mon fichier Personnage.h :

           #ifndef PERSONNAGE_H_INCLUDED
           #define PERSONNAGE_H_INCLUDED
    
           #include <string>
    
           class Personnage
           {
                public :
     
                Personnage();    //Construsteur
                Personnage(std::string nomArme, int degatsArme);
                void recevoirDegats(int nbreDegats);
                void attaquer(Personnage &cible);
                void boirePotionDeVie(int quantitePotion);
                void changerArme(std::string nomNouvelleArme, int degatsNouvelleArme);
                bool estVivant();
    
                private :
    
                int m_vie, m_mana, m_degatsArme;
               std::string m_nomArme;
    
           };
    
           #endif     // PERSONNAGE_H_INCLUDED


    Mon fichier Personnage.cpp :

           #include "Personnage.h"
    
           using namespace std;
     
           Personnage::Personnage()
           {
                m_vie=100;
                m_mana=100;
                m_nomArme="épée de paysan";
                m_degatsArme=5;
           }
      
           void Personnage::recevoirDegats(int nbreDegats)
           {
                m_vie-=nbreDegats;
      
                if(m_vie<0)
                {
                    m_vie=0;
                }
           }
      
           void Personnage::attaquer(Personnage &cible)
           {
                cible.recevoirDegats(m_degatsArme);
           }
      
           void Personnage::boirePotionDeVie(int quantitePotion)
           {
                m_vie+=quantitePotion;
                if(m_vie>100)
                {
                     m_vie=100;
                }
           }
      
           void Personnage::changerArme(string nomNouvelleArme, int degatsNouvelleArme)
           {
                m_degatsArme=degatsNouvelleArme;
                m_nomArme=nomNouvelleArme;
           }
      
           bool Personnage::estVivant()
           {
                return m_vie>0;
           }


    Je ne comprends pas d'où vient le problème car j'ai aussi cocher les cases release et debug lors de la création des fichier .cpp et .h. Je précise aussi que je compile en GCC. Après avoir créer ces fichiers, la compilation ne pose aucun problème, mais après avoir fermer Codes::Blocks et valider les changements, le problème apparaît lorsque j'ouvre de nouveau Code::Blocks.

    Savez-vous d'où peut venir le problème ?

    Merci d'avance pour les réponses.



    -
    Edité par Pairceval 15 novembre 2017 à 1:50:04

    • Partager sur Facebook
    • Partager sur Twitter
      15 novembre 2017 à 7:49:01

      Salut, change de cours, celui la raconte un paquet d'annerie et il n'est plus à jour (d'autre justifieront ca mieux que moi).

      Va plutot sur celui de gbdivers : http://guillaume.belz.free.fr/doku.php?id=programmez_avec_le_langage_c (il n'est pas fini mais il est a jour).

      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2017 à 9:56:34

        Merci pour le conseil.

        J'ai été voir le cours que tu m'as indiqué. Effectivement il n'est pas fini mais il a l'air plus complet sur certaines notions que j'ai vu que le cours que je suis. Je vais en parallèle chercher un autre cours pour les notions non abordées. 

        Mais il n'y a vraiment aucune solution pour mon problème ?

        • Partager sur Facebook
        • Partager sur Twitter
          15 novembre 2017 à 11:42:05

          90% de chance que c'est parce que le fichier "Personnage.cpp" ne fait pas partie des fichier à compiler.(IDE de m....)
          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            15 novembre 2017 à 11:57:13

            Pour faire fonctionner le programme, il faudrait alors que je change d'IDE ?
            • Partager sur Facebook
            • Partager sur Twitter
              15 novembre 2017 à 12:36:15

              Non, faut l'utiliser "correctement", ce qui ne semble pas si simple avec Codes::Blocks.

              Vérifiez que le fichier "Personnage.cpp" est compilé en "Personnage.o" avant que l'éditeur de lien ne commence et que ce fichier .o est dans la liste des fichiers en entré de l'éditeur de lien.

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                15 novembre 2017 à 18:33:57

                Tout c'est passé normalement, le fichier Personnage .o c'est bien créer comme d'habitude. J'ai pas encore pris l'habitude de parcourir tous les paramètres de code::blocks, pour mettre le fichier .o dans l'éditeur c'est bien dans compiler settings ?
                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2017 à 19:02:59

                  Je passe la main à ceux qui connaissent Codes::Blocks, désolé.
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    15 novembre 2017 à 19:53:22

                    Bonsoir,

                    Simple curiosité, au niveau du Wokspace dans la colonne de gauche, tu vois bien cela :



                    Si ce n'est pas le cas, clic-droit sur le nom du Projet -> Add Files... et tu ajoutes tes fichiers Personnage.

                    -
                    Edité par Guit0Xx 15 novembre 2017 à 20:03:09

                    • Partager sur Facebook
                    • Partager sur Twitter

                    ...

                      15 novembre 2017 à 23:24:28

                      C'était tout con ! Au fait, depuis que j'ai commencé à utiliser Code::Blocks je me suis toujours demandé comment refaire apparaître mes projets dans la barre de gauche après avoir rouvert Code::Blocks. Mais comme ça gênais pas dans les premiers programmes, je ne me posais pas plus la question. Il suffit de cliquer sur le lien correspondant sur la page de démarrage. Maintenant ça fonctionne.

                      Merci à tous !

                      PS : C'est normal que lorsque je compile une deuxième fois le code, ça me marque :

                             Target is up to date.
                             Nothing to be done (all items are up-to-date).

                             Voudrait-il me dire que ça ne sert à rien de compiler une deuxième fois ?

                      PS2 : Cela sert vraiment-il à rien que je continue à suivre le cours du site ? comme dit scotthamilton.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 novembre 2017 à 7:39:31

                        Oui tu vas prendre de mauvaise habitude et je te dis pas l'emmerde derriere

                        quand tu veux te mettre a faire du beau code(propre, a jour). T'as l'impression de tout reapprendre.

                        Je parle en connaissance de cause.

                        -
                        Edité par scotthamilton 16 novembre 2017 à 7:40:05

                        • Partager sur Facebook
                        • Partager sur Twitter
                          16 novembre 2017 à 9:23:36

                          D'accord. Merci pour l'avertissement. Je vais donc en tenir compte et plutôt suivre d'autres cours.

                          Merci encore.

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 décembre 2019 à 22:36:07

                            Je ne comprends pas comment tu as résolu ton problème ? Moi j'ouvre bien mon projet avec le lien sur le menu démarrage mais cela ne change rien j'ai le même problème que tu avais ...je ne comprends pas et suis bloqué dans l'avancement des cours :( 

                            • Partager sur Facebook
                            • Partager sur Twitter

                            Problème "undefined reference to" sur Code::Blocks

                            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                            • Editeur
                            • Markdown