Partage
  • Partager sur Facebook
  • Partager sur Twitter

[Qt] Compiler un projet Qt avec Code::Blocks

erreur de link sous Ubuntu

Sujet résolu
    16 avril 2008 à 14:30:14

    Bonjour,

    Je suis actuellement sur Ubuntu et ai installé Code::Blocks version 8.02.
    Lorsque je crée un projet console, je n'ai aucun problème pour le lancer, tout se passe correctement mais voilà, lorsque je crée un projet Qt, tout se passe bien jusqu'à la compilation où j'obtiens plusieurs erreurs de link.

    J'ai en effet ajouté les dossiers d'include nécéssaires pour créer un projet Qt :

    Citation : Dossiers d'include

    /usr/include/qt4/
    /usr/include/qt4/QtGui
    /usr/include/qt4/QtCore



    Citation : Erreur de link

    /home/cedric/Documents/prog/matrices/matrice.h:11: undefined reference to `vtable for Matrice'



    Cependant, je ne comprend pas ce qu'il faut ajouter pour que le "linkage" se passe correctement (les fichiers .lib ou .a ne sont pas situés dans le dossier /usr/lib).
    Le problème ne vient pas de mon code car il compile parfaitement en console.

    J'ai lu sur le forum de Code::Blocks qu'il fallait éditer le makefile des projets Qt mais je ne le trouve pas non plus (décidément je ne suis pas doué :-° ).

    Voilà, si quelqu'un pouvait m'aider, ce serait fort aimable à lui.

    PS : je me sert de Code::Blocks parce que j'avais l'habitude de l'utiliser sur windows avant, il me sert principalement pour la coloration synthaxique ainsi que pour l'auto-complétion de code (pratique pour les noms de variables à rallonge). Je suis en train de m'intéresser à emacs mais bon, je ne peux pas encore dire que je puisse faire quelque chose d'intéressant dessus :euh: .
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2008 à 14:40:38

      Sur Ubuntu je ne sais pas trop comment se passe la compilation mais les erreurs "vtable" sont dues au MOC (Meta Object Compiler), appelé avec la macro Q_OBJECT. Il suffit de refaire tes commandes de compilation (-qmake...) pour inclure le fichier moc_tonfichier.cpp au projet.
      • Partager sur Facebook
      • Partager sur Twitter
        16 avril 2008 à 14:51:13

        Merci, je suis arrivé à lancer l'éxécutable en rajoutant cette ligne à la fin du fichier matrice.cpp (il y avait la macro Q_OBJECT dans matrice.h) :
        #include "moc_matrice.cpp"
        


        Cependant, il doit bien y avoir moyen d'automatiser ce genre d'inclusion, en éxécutant qmake avant la compilation ou je ne sais quoi ... peut-être en trifouillant dans le makefile non ?
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          16 avril 2008 à 16:24:34

          On n'inclus pas les .cpp! Jamais!
          Trois solutions :
          -> Tu ajoutes les moc au projet. (Je suis pas sûr de celle ci.)
          -> Tu passe par le terminal.
          -> Tu te fais un petit compile.sh et tu modifies les options de compilation de C::B.
          • Partager sur Facebook
          • Partager sur Twitter
            16 avril 2008 à 23:26:11

            Bon, je me disait bien qu'inclure les .cpp c'était pas terrible, mais bon ça avait au moins le mérite de fonctionner :-° .
            J'ai refais des tests et voici où j'en suis :

            Le fichier moc_matrice.cpp est créé lors de l'appel de la commande make en console, donc une fois que l'on a compilé une fois en console, on peut inclure le fichier dans le projet et tout fonctionne parfaitement. Cependant j'aimerais bien que même lorsque je compile pour la première fois avec mon IDE, tout se passe bien (hiura, ta troisième solution semble donc la meilleure mais je ne comprend pas comment faire).
            J'aimerais donc changer le makefile, (ou autre fichier de configuration de la compilation) mais je ne sais pas comment m'y prendre. J'ai cherché en vain sur les forums de Code::Blocks, sur le wiki et sur google ...

            Quand à la solution de passer par le terminal, c'est actuellement ce que je fais, je ne me sert de mon IDE seulement pour le côté éditeur de texte.
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              17 avril 2008 à 15:00:58

              Les moc sont créés avec qmake, pas make. donc avant la compilation (la "vraie").

              Utiliser un bash est la technique la plus simple. Tu peux modifier la façon de compiler. Project->Proprieties->coche la case "this is a custom makefile". Clique ensuite sur ok. Project->Build Options->Onglet "Make" Commands->Build Project/Target = sh compile.sh . Et le compile.sh :
              #!/bin/sh
              # compile le projet à partir d'un fichier pro existant.
              qmake-qt4 FileName.pro
              make
              


              Je crée toujours mes fichiers pro moi même. Pourquoi? Parce que je modifie pas mal de variables.
              • Partager sur Facebook
              • Partager sur Twitter
                17 avril 2008 à 20:04:53

                Bon alors je viens de réessayer et j'ai bien regardé les fichiers créés lors de la compilation et voici ce que j'obtient :
                Lors de l'appel de qmake -project, le fichier .pro est créé
                Lors de l'appel de qmake-qt4, le fichier Makefile est créé
                Lors de l'appel de make, les fichiers main.o, matrice.o, moc_matrice.cpp, moc_matrice.o ainsi que l'exécutable sont créés :

                cedric@cedric-laptop:~/Documents/prog/matrices$ make
                g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB 
                     -I/usr/share/qt4/mkspecs/linux-g++ -I. 
                     -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui 
                     -I/usr/include/qt4 -I. -I. -I. -o main.o main.cpp
                g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB 
                     -I/usr/share/qt4/mkspecs/linux-g++ -I. 
                     -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui 
                     -I/usr/include/qt4 -I. -I. -I. -o matrice.o matrice.cpp
                /usr/bin/moc-qt4 -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB -I/usr/share/qt4/mkspecs/linux-g++ 
                     -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore 
                     -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. -I. 
                     -I. matrice.h -o moc_matrice.cpp
                g++ -c -pipe -fpermissive -g -Wall -W -D_REENTRANT -DQT_SHARED -DQT_GUI_LIB -DQT_CORE_LIB 
                     -I/usr/share/qt4/mkspecs/linux-g++ -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4/QtCore 
                     -I/usr/include/qt4/QtGui -I/usr/include/qt4/QtGui -I/usr/include/qt4 -I. 
                     -I. -I. -o moc_matrice.o moc_matrice.cpp
                g++ -Wl,--no-undefined -o matrices main.o matrice.o moc_matrice.o    -L/usr/lib -lQtGui -lQtCore -lpthread


                Bon sinon pour les options de Code::Blocks, je suis en train de regarder en profondeur mais j'arrive à avoir un truc qui fonctionne à peu près, ça s'annonce bien ^^ . Je vais encore trifouiller un peu partout histoire d'avoir un truc tout beau tout propre.
                Sinon j'ai lu ton tuto en diagonale et j'ai compris l'utilité de créer ses propres fichiers .pro, je le lirais correctement plus tard.

                Encore merci de ton aide précieuse ;) .
                • Partager sur Facebook
                • Partager sur Twitter
                  10 mai 2008 à 16:29:38

                  peux-tu m'aider car je n'arrive pas à configurer code bloock 8.02 pour Qt 4
                  • Partager sur Facebook
                  • Partager sur Twitter

                  [Qt] Compiler un projet Qt avec 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