Partage
  • Partager sur Facebook
  • Partager sur Twitter

Incompréhension erreur a la compilation

    19 mars 2019 à 14:37:53

    Bonjour, 

    je ne comprends pas absolument pas quel est le problème dans mon code je reçois ces messages d erreur a la compilation:

    ||=== Build: Debug in nutriment (compiler: GNU GCC Compiler) ===|
    obj\Debug\src\core.o||In function `ZSt11__addressofI4foodEPT_RS1_':|
    C:\Users\hp\Desktop\nutriment\src\core.cpp|3|multiple definition of `nutriments[abi:cxx11]'|
    obj\Debug\main.o:C:\Users\hp\Desktop\nutriment\main.cpp|6|first defined here|
    obj\Debug\src\food.o||In function `ZN4foodC2Ev':|
    C:\Users\hp\Desktop\nutriment\src\food.cpp|3|multiple definition of `nutriments[abi:cxx11]'|
    obj\Debug\main.o:C:\Users\hp\Desktop\nutriment\main.cpp|6|first defined here|
    obj\Debug\src\nutriment.o||In function `ZN9nutrimentC2Ev':|
    C:\Users\hp\Desktop\nutriment\src\nutriment.cpp|3|multiple definition of `nutriments[abi:cxx11]'|
    obj\Debug\main.o:C:\Users\hp\Desktop\nutriment\main.cpp|6|first defined here|
    ||error: ld returned 1 exit status|
    ||=== Build failed: 7 error(s), 0 warning(s) (0 minute(s), 1 second(s)) ===|

    Apparement ça vient de la classe food alors la voici:

    #ifndef FOOD_H
    #define FOOD_H
    
    #include "../misc.h"
    #include <iostream>
    #include <vector>
    #include <fstream>
    
    using namespace std;
    
    class food
    {
        public:
            food();
            ~food();
    
            int create();
            int edit();
            int trash();
    
            int load();
            int save();
    
        private:
            string m_name;
            float m_nutriments[22];
    };
    
    #endif // FOOD_H

    et son prototype:

    #include "food.h"
    
    food::food()
    {
        //ctor
    }
    
    food::~food()
    {
        //dtor
    }
    
    int food::create()
    {
        cout << "Name : ";
        cin >> m_name;
    
        for(int i = 0; i < 22; i++)
        {
            cout << nutriments[i] << " : ";
            cin >> m_nutriments[i];
        }
    
        return 0;
    }
    

    Je ne comprends vraiment pas quel est le problème.


    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2019 à 15:49:27

      >Apparement ça vient de la classe food alors la voici:

      Bin, "Apparement", il dit beaucoup de connerie.

      Le message d'erreur est assez claire (quand on décrypte un peu la langue compilateur, ça viendra).

      Le compilateur voit 2 déclarations différentes de la variable globale "nutriments", les variables globales, c'est CACA.

      L'une dans core.cpp ou l'un de ses includes comme core.h, et l'autre dans main.cpp.

      Mais bon, que la compilation de core.cpp voit les variables globales de main.cpp, il y a clairement du nimpornawak dans les includes.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        19 mars 2019 à 17:08:12

        Je n'ai déclaré le variable nutriment que dans un fichier, celui ci:

        #ifndef MISC_H
        #define MISC_H
        
        #include <iostream>
        
        using namespace std;
        
        struct id
        {
            int widget;
            int element;
        };
        
        string nutriments[22] = {
        
            "calcium",
            "Cuivre",
            "Fer",
            "Iode",
            "Magnesium",
            "Manganese",
            "Phosphore",
            "Potassium",
            "Selenium",
            "Sodium",
            "Zinc",
            "Vitamine A",
            "Vitamine B1",
            "Vitamine B2",
            "Vitamine B3",
            "Vitamine B5",
            "Vitamine B6",
            "Vitamine b9",
            "Vitamine B12",
            "Vitamine C",
            "Vitamine D",
            "Vitamine E"};
        
        #endif // MISC_H
        

        Que je n'utilise que dans une classe, son prototype:

        #ifndef FOOD_H
        #define FOOD_H
        
        #include "../misc.h"
        #include <iostream>
        #include <vector>
        #include <fstream>
        
        using namespace std;
        
        class food
        {
            public:
                food();
                ~food();
        
                int create();
                int edit();
                int trash();
        
                int load();
                int save();
        
            private:
                string m_name;
                float m_nutriments[22];
        };
        

        Et sa déclaration:

        #include "food.h"
        
        food::food()
        {
            //ctor
        }
        
        food::~food()
        {
            //dtor
        }
        
        int food::create()
        {
            cout << "Name : ";
            cin >> m_name;
        
            for(int i = 0; i < 22; i++)
            {
                cout << nutriments[i] << " : ";
                cin >> m_nutriments[i];
            }
        
            return 0;
        }





        • Partager sur Facebook
        • Partager sur Twitter
          19 mars 2019 à 17:54:53

          Règle de base, ne mettre dans les includes d'un .h que les .h nécessaire au .h, pas ceux uniquement à l'implémentation dans le cpp.

          Donc, "../misc.h" n'a rien à faire dans le food.h.

          Je ne sais pas pourquoi la déclaration+définition de la globale "nutriments" dans "misc.h" est interprétée différemment dans food.cpp (food.cpp->food.h->misc.h) et dans main.cpp (main.cpp->food.h->misc.h, c'est putatif, mais la probabilité de cette série d'include doit dépasser les 99%), mais bon, j'avais pas dit que les variable globales c'est CACA ? :colere2:

          Moi, je cherche pas trop les emmerdes avec les variables globales, donc j'ai jamais ce type de problème. Mais en plus, coller la définition de la globale dans le .h, avec sa déclaration, c'est vraiment chercher les baffes du compilateur.

          Soit vous virez cette variables globale, quitte à en faire une constante statique d'une classe ou d'un namespace qui va bien, soit vous collez cette définition dans un "misc.cpp" et nettoyez vos headers de tout ce bordel.

          • Partager sur Facebook
          • Partager sur Twitter
          Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
            19 mars 2019 à 18:41:45

            Euh, je viens de couper coller la déclaration de nutriments du misc dans le prototype de ma classe food ert j ai exactement la meme erreur:

            #ifndef FOOD_H
            #define FOOD_H
            
            #include "misc.h"
            #include <iostream>
            #include <vector>
            #include <fstream>
            
            using namespace std;
            
            string nutriments[22] = {
            
                "calcium",
                "Cuivre",
                "Fer",
                "Iode",
                "Magnesium",
                "Manganese",
                "Phosphore",
                "Potassium",
                "Selenium",
                "Sodium",
                "Zinc",
                "Vitamine A",
                "Vitamine B1",
                "Vitamine B2",
                "Vitamine B3",
                "Vitamine B5",
                "Vitamine B6",
                "Vitamine b9",
                "Vitamine B12",
                "Vitamine C",
                "Vitamine D",
                "Vitamine E"};
            
            class food
            {
                public:
                    food();
                    ~food();
            
                    int create();
                    int edit();
                    int trash();
            
                    int load();
                    int save();
            
                private:
                    string m_name;
                    float m_nutriments[22];
            };
            
            #endif // FOOD_H
            



            • Partager sur Facebook
            • Partager sur Twitter
              19 mars 2019 à 19:30:18

              >Euh, je viens de couper coller la déclaration

              Ce n'est pas qu'une déclaration, c'est aussi une définition/implémentation/initialisation.

              Et les définitions/implémentation/initialisation, sauf pour les templates, n'ont généralement rien à foutre dans les .h, bordel.

              > dans le prototype de ma classe food

              Non, c'est pas dans votre classe food, c'est toujours une variable globale, une de plus (en fait autant que ce .h est inclus dans un cpp différent), il y en a donc maintenant au moins trois de cette cochonnerie de variable globale, GG.

              >ert j ai exactement la meme erreur:

              Normal, vous n'avez fait qu’empirer le problème, et le compilateur, c'est pas un autiste du comptage comme RainMain, il trouve 2 variables globales de même nom, il vous envoie bouler (il est pas obligé de les compter pour vous faire plaisir.).

              P.S.: Je sais plus si je l'ai déjà dit, les variables globales, c'est caca.:colere2:

              • Partager sur Facebook
              • Partager sur Twitter
              Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

              Incompréhension erreur a la compilation

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              • Editeur
              • Markdown