Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreur inconnue a la compilation

Sujet résolu
    8 avril 2022 à 6:22:32

    Salut

    Comme le dit le titre, je tombe sur une erreur de compilation que je comprends pas:

    PS C:\Users\tiwab\Documents\cpp_projects\Simplexe> g++ Simplexe/*.cpp 
    C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\tiwab\AppData\Local\Temp\ccx3YZkJ.o:Simplexe.cpp:(.text+0x0): multiple definition of `checkSubAdvance()'; C:\Users\tiwab\AppData\Local\Temp\ccCmuh8V.o:main.cpp:(.text+0x0): first 
    defined here
    C:/msys64/mingw64/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: C:\Users\tiwab\AppData\Local\Temp\ccx3YZkJ.o:Simplexe.cpp:(.bss+0x0): multiple definition of `sub_step'; C:\Users\tiwab\AppData\Local\Temp\ccCmuh8V.o:main.cpp:(.bss+0x0): first defined here
    collect2.exe: error: ld returned 1 exit status

    J'ai défini une fonction checkSubAdvance() dans un fichier d'entete pour pourvoir d'une certaine manière "déboguer" mon code:

    // Fichier Simplexe.hpp
    // A la fin du fichier, apres la declaration de la classe Simplexe et de ses attributs et methodes.
    
    
    // J'appelle cette fonction dans Simplexe.cpp, meme en retirant les lignes ou je l'appelle, la mm erreur survient
    int sub_step{0};
    void checkSubAdvance()
    {
        std::cout << "\nReached sub-step " << sub_step << std::endl;
        ++sub_step;
    }


     
     

    -
    Edité par Asmitta 8 avril 2022 à 6:24:52

    • Partager sur Facebook
    • Partager sur Twitter
      8 avril 2022 à 6:34:38

      Une fonction (et tout en C++, en fait) peut être déclarée plusieurs fois, mais défini qu'une seule fois (ODR = one definition rule).

      // un déclaration de fonction
      void foo();
      
      // une définition de fonction
      void foo() 
      {
          ...
      }

      Quand tu mets ta définition de fonction dans le header et que ton header est inclue dans 2 fichiers source, alors tu vas avoir 2 copies de ta definition de fonction et donc non respect de l'ODR.

      Je comprend pas ton histoire de déboguer. Donc la meilleure correction a faire, c'est de déplacer ta définition dans un fichier source et d'avoir que la déclaration dans le header.

      Si tu veux quand meme garder ta definition de fonction dans le header (mais sache que je te regarde avec un regard severe dans ce cas), tu dois ajouter inline ou static.

      inline void checkSubAdvance()
      {
          ...
      }

      -
      Edité par gbdivers 8 avril 2022 à 6:34:52

      • Partager sur Facebook
      • Partager sur Twitter
        8 avril 2022 à 6:43:16

        Merci j'ai défini la fonction dans Simplexe.cpp et tout marche maintenant. Sinon déboguer ici pour moi c'est connaitre d'où vient l'erreur. Mon code signale des erreurs et je connais pas quelle fonction appelle la fonction soulevant l'erreur. J'affiche donc des messages un peu de partout dans le code pour connaitre ou l'arret c'est fait...assert() est tres brute
        • Partager sur Facebook
        • Partager sur Twitter
          8 avril 2022 à 12:26:37

          Comme ton code ne compilait pas, on ne voyait pas pourquoi tu parlais de debugger.
          En effet, un debugger te permettra d'y voir plus clair. Tu as raison.

          Tu es sous Windows et as choisi de travailler sous MSYS plutôt que les outils Visual qui sont nettement plus confortable pour le debug. Dommage moi je ne peux pas vraiment t'aider dans cet environnement.

          • Partager sur Facebook
          • Partager sur Twitter

          En recherche d'emploi.

            8 avril 2022 à 18:39:23

            Je suis bien sur VSCode mais j'arrive pas a déboguer comme je veux. J'ai des assert() dans des définitions de fonctions et quand une erreur est soulevée le debogueur vscode me dit rien sur la fonction appelée la fonction qui soulève l'erreur par exemple. J'affiche donc des messages pour mieux voir la source
            • Partager sur Facebook
            • Partager sur Twitter
              8 avril 2022 à 19:01:55

              Autrefois, on n'avais pas de debugger et on se débrouillait avec les affichages.
              Affiches avant et après chaque fonction majeure, puis va à l'intérieur, etc.
              C'est ce que j'appelle du debugging dichotomique. :)
              • Partager sur Facebook
              • Partager sur Twitter

              Le Tout est souvent plus grand que la somme de ses parties.

              Erreur inconnue a la compilation

              × 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