IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Discussion :

Qt5 et CMake [Compilation]


Sujet :

Outils

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut Qt5 et CMake
    Bonjour à tous,

    Je voudrais compiler un programme en utilisant Qt et CMake mais j'obtiens un message d'erreur à la compilation.
    J'ai mis dans deux dossiers différents les fichiers source et les header et mon problème vient de là car j'obtiens le message d'erreur suivant :

    AUTOMOC: error: qt/boite_de_dialogue/source/MaFenetre.cpp The file includes the moc file "moc_MaFenetre.cpp", but could not find header "MaFenetre{.h,.hh,.h++,.hm,.hpp,.hxx,.in,.txx}" in qt/boite_de_dialogue/source/
    Lorsque mon fichier MaFenetre.hh et dans le dossier source ça fonctionne mais si je le laisse dans le dossier header ça ne fonctionne plus !
    Pouvez-vous m'aider s'il vous plaît ?


    Voici mon fichier hh :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
     
    #ifndef DEF_MAFENETRE
    #define DEF_MAFENETRE
     
    #include <QApplication>
    #include <QWidget>
    #include <QPushButton>
    #include <QMessageBox>
     
    class MaFenetre : public QWidget
    {
        Q_OBJECT
     
    public:
      MaFenetre();
     
    public slots:
      void ouvrirDialogue();
     
    private:
      QPushButton *m_boutonDialogue;
    };
     
    #endif
    mon fichier cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    #include "MaFenetre.hh"
    #include "moc_MaFenetre.cpp"  
     
    MaFenetre::MaFenetre() : QWidget()
    {
      setFixedSize(230, 120);
     
      m_boutonDialogue = new QPushButton("Ouvrir la boîte de dialogue", this);
      m_boutonDialogue->move(40, 50);
     
      QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
    }
     
    void MaFenetre::ouvrirDialogue()
    {
      QMessageBox::warning(this,"Title of the window","hello les zeros");
    }
    mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
     
    #include <QApplication>
    #include "MaFenetre.hh"
     
     
    int main(int argc, char *argv[])
    {
      QApplication app(argc, argv);
     
      MaFenetre fenetre;
      fenetre.show();
     
      return app.exec();
    }
    et mon fichier CMakeLists.txt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8)
     
    PROJECT(main)
     
    # Appeler automatique le moc quand nécessaire
    SET(CMAKE_AUTOMOC ON)
    # Les fichiers générés par le moc sont générés dans le dossier bin, dire à CMake de toujours 
    # inclure les entêtes de ce dossier
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
    # Le module QtWidgets trouve ses propres dépendances
    FIND_PACKAGE(Qt5Widgets REQUIRED)
     
    #Inclusion de mes en-têtes publics
    include_directories(header)
     
    file(
        GLOB_RECURSE
        source_files
        source/*      
    )
     
    ADD_EXECUTABLE(main ${source_files})
     
    QT5_USE_MODULES(main Widgets)
    # La fonction QT5_USE_MODULE encapsule toutes les routines nécessaires à l'utilisation 
    # d'un module
    QT5_USE_MODULES(main Widgets)

  2. #2
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Par défaut
    Salut,

    Ton problème vient de ton fichier d'inclusion au niveau de MaFenetre.cpp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #include "MaFenetre.hh"
    //#include "moc_MaFenetre.cpp"   <----- retire cette ligne
     
    MaFenetre::MaFenetre() : QWidget()
    {
      setFixedSize(230, 120);
     
      m_boutonDialogue = new QPushButton("Ouvrir la boîte de dialogue", this);
      m_boutonDialogue->move(40, 50);
     
      QObject::connect(m_boutonDialogue, SIGNAL(clicked()), this, SLOT(ouvrirDialogue()));
    }
    Ensuite, il faut que tu wrap ton le fichier d'entête de ton moc à ton fichier source.
    En CMake, tu peux faire ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    qt5_wrap_cpp(MOCFILES header/MaFenetre.hh)
     
    ADD_EXECUTABLE(main ${source_files} ${MOCFILES})

  3. #3
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Je te conseile la lecture d'un article que j'ai traduit qui explique comment utiliser CMake et Qt 5 conjointement.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    Je vous remercie pour votre aide.
    Existe t-il un moyen de rendre plus générique cette instruction (pour ne pas avoir à écrire le nom de chaque header contenant un Q_OBJECT) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    qt5_wrap_cpp(MOCFILES header/MaFenetre.hh)

  5. #5
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Tu peux ajouter dans le CMakeLists.txt à la racine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Appeler automatique le moc quand nécessaire
    SET(CMAKE_AUTOMOC ON)
    # Les fichiers générés par le moc sont générés dans le dossier bin, dire à CMake de toujours     
    # inclure les entêtes de ce dossier
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
    Les détails sont dans le tutoriel mentionné ci-dessus.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    En fait c'est ce que j'ai fais au début mais j'ai eu un message d'erreur qui est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    CMakeFiles/main.dir/source/MaFenetre.cpp.o: dans la fonction « MaFenetre::MaFenetre() »:
    MaFenetre.cpp:(.text+0x3d): référence indéfinie vers « vtable for MaFenetre »
    MaFenetre.cpp:(.text+0x4f): référence indéfinie vers « vtable for MaFenetre »
    CMakeFiles/main.dir/source/main.cpp.o: dans la fonction « MaFenetre::~MaFenetre() »:
    main.cpp:(.text._ZN9MaFenetreD2Ev[_ZN9MaFenetreD5Ev]+0x13): référence indéfinie vers « vtable for MaFenetre »
    main.cpp:(.text._ZN9MaFenetreD2Ev[_ZN9MaFenetreD5Ev]+0x25): référence indéfinie vers « vtable for MaFenetre »
    collect2: error: ld returned 1 exit status
    make[2]: *** [main] Erreur 1
    make[1]: *** [CMakeFiles/main.dir/all] Erreur 2
    make: *** [all] Erreur 2
    Si vous observez bien mon fichier CMakeList.txt est le même que celui que vous avez écrit, j'ai juste modifié certaines choses pour convenir à mes besoins.

  7. #7
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Effectivement j'avais répondu un peu trop vite.

    Alors voila un CMakeLists.txt fonctionnel et simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    CMAKE_MINIMUM_REQUIRED(VERSION 2.8.8)
     
    PROJECT(main)
     
    # Appeler automatique le moc quand nécessaire
    SET(CMAKE_AUTOMOC ON)
     
    # Les fichiers générés par le moc sont générés dans le dossier bin, dire à CMake de toujours 
    # inclure les entêtes de ce dossier
    SET(CMAKE_INCLUDE_CURRENT_DIR ON)
     
    # Modules de Qt en dépendance
    FIND_PACKAGE(Qt5 COMPONENTS Gui Core Widgets)
     
    # Je trouve qu'il vaut mieux lister les fichiers histoire d'être certain des fichiers traités
    FILE(
        GLOB_RECURSE
        FICHIERS_SOURCES
        sources/main.cpp
        sources/fenetre.cpp
    )
     
    # ${PROJECT_NAME} contient le nom du projet, étonnant non ? ;)
    ADD_EXECUTABLE(${PROJECT_NAME} ${FICHIERS_SOURCES})
     
    TARGET_LINK_LIBRARIES(${PROJECT_NAME} Qt5::Widgets Qt5::Core Qt5::Gui)
    Par ailleurs, n'inclus pas les fichiers .moc. J'ai mis en pièce-jointe une archive fonctionnelle du projet.

    Aussi, je vois que tu utilises la syntaxe de Qt 4 pour tout ce qui est signaux/slots. Qt 5 propose une nouvelle syntaxe qui permet de faire un certain nombre de vérifications à la compilation. Désolé, aujourd'hui était la journée d'auto-promotion par an.
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    =) pas de soucis, je t'en remercie.

    Je me suis servi de tes indications mais le problème c'est que dans CMakeLists.txt je ne peux toujours pas mettre mes headers dans un dossier différent de mes fichiers cpp.
    Séparer mes headers de mes sources puis mettre cette instruction dans mon CMakeLists.txt provoque le même message d'erreur que précédemment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #Inclusion de mes en-têtes publics
    include_directories(header)

  9. #9
    Rédacteur/Modérateur
    Avatar de arnolddumas
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    978
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Autriche

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2012
    Messages : 978
    Par défaut
    Pourquoi veux-tu inclure les fichiers d'en-tête dans ton fichier CMakeLists.txt ?

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 421
    Par défaut
    C'est juste une question d'organisation de mon code.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. CMake avec Qt5+Qt3d ?
    Par Kaluza dans le forum Qt
    Réponses: 0
    Dernier message: 20/05/2013, 15h35
  2. Kubuntu - KDevelop : cmake non trouvé
    Par Trap D dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 09/07/2007, 10h49
  3. Problèmes d'installation : KDevelop / KUbuntu / CMake
    Par Feriaman dans le forum Autres éditeurs
    Réponses: 1
    Dernier message: 03/02/2007, 23h55
  4. cmake vs automake vs bjam
    Par epsilon68 dans le forum Choisir un environnement de développement
    Réponses: 16
    Dernier message: 14/11/2006, 09h22

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo