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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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