Partage
  • Partager sur Facebook
  • Partager sur Twitter

Impossible de compiler du C++ avec g++ ( linux )

    26 juin 2007 à 19:41:13

    Bonjour !!
    Voilà je viens de télécharger les sources du programme "RPG", de la lecons sur les classes du cours de mateo ( partie 2/2 ), je suis sous linux, j'ai tenté de compiler le programme sans succès ...

    cd /..../ledossierdujeu
    g++ main.cpp -o rpg


    et j'obtiens des magnifiques erreurs

    /tmp/ccrDPD2x.o: In function `main':
    main.cpp:(.text+0x8b): undefined reference to `Personnage::Personnage()'

    main.cpp:(.text+0xca): undefined reference to `Personnage::Personnage(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'
    main.cpp:(.text+0x10a): undefined reference to `Personnage::attaquer(Personnage&)'

    main.cpp:(.text+0x138): undefined reference to `Personnage::boirePotionDeVie(int)'
    main.cpp:(.text+0x14a): undefined reference to `Personnage::attaquer(Personnage&)'

    main.cpp:(.text+0x15c): undefined reference to `Personnage::attaquer(Personnage&)'
    main.cpp:(.text+0x19b): undefined reference to `Personnage::changerArme(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, int)'

    main.cpp:(.text+0x1db): undefined reference to `Personnage::attaquer(Personnage&)'
    main.cpp:(.text+0x225): undefined reference to `Personnage::afficherEtat()'

    main.cpp:(.text+0x264): undefined reference to `Personnage::afficherEtat()'
    main.cpp:(.text+0x276): undefined reference to `Personnage::~Personnage()'

    main.cpp:(.text+0x289): undefined reference to `Personnage::~Personnage()'
    main.cpp:(.text+0x299): undefined reference to `Personnage::~Personnage()'

    main.cpp:(.text+0x2b2): undefined reference to `Personnage::~Personnage()'
    collect2: ld returned 1 exit status

       



    vous savez comment je dois appeler g++ pour qu'il me compile ca ??

    merci beaucoup

    p.s. j'ai gcc/g++ 4.1.3
    • Partager sur Facebook
    • Partager sur Twitter
      26 juin 2007 à 19:51:33

      Hello,

      Le problème vient simplement du fait qu'il faut indiquer tous les fichiers à compiler.

      Donc ici:

      g++ main.cpp Personnage.cpp Arme.cpp -o rpg


      ou alors tout en 1:

      g++ *.cpp -o rpg


      Le mieux (meme si la c'est pas nécessaire vu qu'il y a que 3 fichiers) serait en fait de faire un Makefile. Pou plus de détail tapes:

      man make


      dans ta console.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        26 juin 2007 à 19:53:43

        ya pas un moyen de faire "suivre" les includes à gcc ?? ( cpa terrible lol )
        • Partager sur Facebook
        • Partager sur Twitter
          26 juin 2007 à 19:55:39

          il suit les includes.

          Mais si tu regardes ton code, tu inclus un .h

          Il ne te reste plus qu'à compiler les .cpp

          Utilises le *.cpp si tu veux pas tout écrire :p
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            27 juin 2007 à 0:49:32

            on peut aussi directement inclure les .ccp via un #include aussi non ? ( c'est mal ? )
            • Partager sur Facebook
            • Partager sur Twitter
              27 juin 2007 à 0:55:10

              Excessivement mal.
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                27 juin 2007 à 1:13:37

                Au lieu de lier des choses déjà compilées séparément chacunes de leur côté, tu recompiles absolument tout à chaque modification.

                Les temps de (re)compilation sont déjà assez longs.
                • Partager sur Facebook
                • Partager sur Twitter
                C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                  27 juin 2007 à 11:50:17

                  mais par exemple, j'ai un main.cpp un classe.cpp et un classe.h
                  je ne modifie que le main par exemple, comment je peux recompiler le projet en ne recompilant que le main ?

                  autrement dit comment tu fais pour "compiler séparément de chaque côté" ?
                  ( si t'as un makefile tout prêt je suis preneur :) )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    27 juin 2007 à 12:03:33

                    Bah justement, si tu n'icludes que les .h, dès que tu modifies un .cpp il n'y que le .cpp en question qui est recompilé.

                    En gros, tu recompiles seulement les fichiers modifiés.

                    Donc si tu inclues classe.cpp à main.cpp et que tu modifies classe.cpp, ben comme il est inclu dans main.cpp, c'est comme si t'avais modifié main.cpp donc ça recompile.

                    Je ne sais pas si j'ai été clair :-p

                    Tod
                    • Partager sur Facebook
                    • Partager sur Twitter
                      27 juin 2007 à 13:31:31

                      Tu es clair mais c'est faux.

                      g++ en ligne de commande compile tout ce qu'on lui passe en argument.

                      Si tu veux compiler qu'une partie, il faut faire un makefile.

                      http://www.hsrl.rutgers.edu/ug/make_help.html
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                        27 juin 2007 à 15:04:33

                        merci, je me suis documenté sur les makefile, et j'ai capté comment ca marchait, voila le makefile que je me suis fait :


                        execpp: main.o laclasse.o
                        g++ main.o laclasse.o -o execpp

                        main.o: main.cpp laclasse.h
                        g++ -c main.cpp

                        laclasse.o: laclasse.h laclasse.cpp
                        g++ -c laclasse.cpp


                        Pour ceux qui ca interesse :

                        L'executable final ( 1ère ligne ) est produit à partir des fichiers objets ( .o ), main.o et laclasse.o, quand je tape make execpp, il lit les 2 dépendances, ca le renvoie aux 2 règles du dessous, chacune des 2 ne s'execute que si leurs fichier de dépendances sont plus récents que la derniere compilation, une fois que ces 2 règles sont terminées, il revient a la 1ère et l'execute ( ou pas si aucun des .o n'a été recompilé ).

                        Par exemple si je modifie le main.cpp, seules la 1ère et la 2ème commande seront executées en tapant make execpp ( vu que le laclasse.o est déjà existant et a jour )

                        pour créer un .o ( compiler sans lier ), c'est gcc/g++ -c source.c/cpp
                        • Partager sur Facebook
                        • Partager sur Twitter
                          27 juin 2007 à 15:07:52

                          Nanoc:
                          C'est bien ce qui me semblait, je n'ai pas été très clair.

                          Je ne parlais pas de la ligne de commande. Ce que j'ai essayé de dire c'est que si il s'amuse à include tous les .cpp dans son main.cpp, dès qu'il essayera de compiler main.cpp ça recompilera tout le projet (à cause des includes) par contre si il n'include que les .h et qu'il modifie son main.cpp, il n'aura pas besoin de recompiler classe.cpp

                          ça se trouve j'ai été encore plus confus :-p

                          Tod
                          • Partager sur Facebook
                          • Partager sur Twitter

                          Impossible de compiler du C++ avec g++ ( linux )

                          × 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