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

Systèmes de compilation Discussion :

Qt4 + CMake


Sujet :

Systèmes de compilation

  1. #1
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut Qt4 + CMake
    Bonjour/bonsoir

    Je sais qu'on peut facilement faire un make avec qmake mais j'ai envie d'essayer cmake avec Qt maintenant que j'utilise cmake pour la plupart de mes projets.
    Donc j'ai un projet simple pour l'instant : dossier bin;headers;src et 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
    29
     
    cmake_minimum_required(VERSION 2.6)
     
    project(ImageLoader)
    set(EXECUTABLE_OUTPUT_PATH bin/)
    set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
     
    find_package (Qt4 REQUIRED)
     
    include_directories (
      headers
      ${QT_USE_FILE}
    )
     
    file(
      GLOB_RECURSE
      source_files
      ./src/*
    )
     
    add_executable (
      ImageLoader
      ${source_files}
    )
     
    target_link_libraries (
      ImageLoader
      ${QT_LIBRARIES}
    )
    Malheureusement cela me retourne cette erreur au moment de faire le make et je vois pas ce que j'ai oublié de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    0:21 nicolas@AuraHxC-Desktop ~/Programmation/imagerie% make
    [ 50%] Building CXX object CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o
    cc1plus: error: /usr/share/cmake-2.6/Modules/UseQt4.cmake: not a directory
    make[2]: *** [CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o] Erreur 1
    make[1]: *** [CMakeFiles/ImageLoader.dir/all] Erreur 2
    make: *** [all] Erreur 2
    zsh: exit 2     make
    Une idée ? merci d'avance

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Enlève ${QT_USE_FILE} dans include_directories.

    Peut-être veux-tu faire include (${QT_USE_FILE}), encore que je n'ai pas le souvenir que cela soit nécessaire.

  3. #3
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Effectivement cela fonctionne mieux par contre maintenant j'ai ça :

    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
     
    10:47 nicolas@AuraHxC-Desktop ~/Programmation/imagerie% make
    Scanning dependencies of target ImageLoader
    [ 50%] Building CXX object CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o
    [100%] Building CXX object CMakeFiles/ImageLoader.dir/src/main.cpp.o
    Linking CXX executable bin/ImageLoader
    CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o: In function `ImageViewer::ImageViewer()':
    imageViewer.cpp:(.text+0x3e): undefined reference to `vtable for ImageViewer'
    imageViewer.cpp:(.text+0x4a): undefined reference to `vtable for ImageViewer'
    CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o: In function `ImageViewer::ImageViewer()':
    imageViewer.cpp:(.text+0x2bc): undefined reference to `vtable for ImageViewer'
    imageViewer.cpp:(.text+0x2c8): undefined reference to `vtable for ImageViewer'
    CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o: In function `ImageViewer::~ImageViewer()':
    imageViewer.cpp:(.text+0x512): undefined reference to `vtable for ImageViewer'
    CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o:imageViewer.cpp:(.text+0x51e): more undefined references to `vtable for ImageViewer' follow
    CMakeFiles/ImageLoader.dir/src/imageViewer.cpp.o: In function `ImageViewer::tr(char const*, char const*)':
    imageViewer.cpp:(.text._ZN11ImageViewer2trEPKcS1_[ImageViewer::tr(char const*, char const*)]+0x20): undefined reference to `ImageViewer::staticMetaObject'
    collect2: ld returned 1 exit status
    make[2]: *** [bin/ImageLoader] Erreur 1
    make[1]: *** [CMakeFiles/ImageLoader.dir/all] Erreur 2
    make: *** [all] Erreur 2
    zsh: exit 2     make
    Et je pense pas que cela vienne de mon code vu que je viens de faire le test en utilisant la méthode qmake -project ; qmake ; make et aucun soucis j'ai un executable qui fonctionne.

    EDIT : En fait cela doit venir du fait que j'utilise des slot et qu'il y a une macro Q_OBJECT de déclaré dans ma classe donc il faut moc, mais je ne sais pas trop quoi utilisé avec CMake, je vois qu'il faut utiliser une macro spécial mais laquelle et comment là est la question.

  4. #4
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    J'ai un peu avancé mais toujours pareil niveau erreur ou compilation, je commence a sécher :s

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
     
    #Version Minimum utilisé
    cmake_minimum_required(VERSION 2.6)
     
    #Nom du projet
    project(ImageLoader)
     
    #Executable enregistré dans le dossier bin
    set(EXECUTABLE_OUTPUT_PATH bin/)
     
    #Ajout dans une variable des fichiers headers contenant 
    #des slots ou la macro Q_OBJECT
    set(MOC_HEADERS headers/imageViewer.hpp)
     
    #Mets dans la variable CMAKE_MODULE_PATH les fichiers .cmake contenu
    #dans le dossier cmake/ (fichier Findx.cmake)
    #set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
     
    #Utilisation du module Qt4 de CMake
    find_package(Qt4 REQUIRED)
     
    #Creation du code moc avec les fichiers headers contenu
    #dans la variable MOC_HEADERS
    QT4_WRAP_CPP(
      MOC_OUTFILES
      ${MOC_HEADERS}
    )
     
    #Ajout d'un fichier CMake, ici QT_USE_FILE
    include(
      ${QT_USE_FILE}
    )
     
    #Ajout aux headers pour la construction du dossier headers/
    include_directories(
      headers
    )
     
    #Chargement dans la variable source_file des fichiers
    #source contenu dans le dossier src/
    file(
      GLOB_RECURSE
      source_files
      ./src/*.cpp
    )
     
    add_library(
      libImageLoader 
      STATIC
      ${source_files}
      ${FOO_MOC_OUTFILES}
    )
     
    #Ajout d'un executable du nom de ImageLoader construit
    #avec les sources contenu dans la variable source_files
    add_executable (
      ImageLoader
      ${source_files}
    )
     
    #liaison des librairies (ici librairie Qt) avec la cible 
    #spécifié (ici ImageLoader) 
    target_link_libraries (
      ImageLoader
      ${libImageLoader}
      ${QT_LIBRARIES}
    )
    Si quelqu'un arrive a me débloquer j'en serais bien content parce que j'aimerais bien avancer un peu

  5. #5
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Choisis entre MOC_OUTFILES ou FOO_MOC_OUTFILES mais ça doit être la même variable dans QT4_WRAP_CPP et add_library.

    Toutefois, l'erreur me laisse perplexe. Est-ce que je peux voir imageViewer.hpp et imageViewer.cpp ?

    De même, source_files dans add_library ou dans add_executable mais pas dans les deux.

  6. #6
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Citation Envoyé par aoyou Voir le message
    Choisis entre MOC_OUTFILES ou FOO_MOC_OUTFILES mais ça doit être la même variable dans QT4_WRAP_CPP et add_library.

    Erreur de frappe.

    De même, source_files dans add_library ou dans add_executable mais pas dans les deux.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
     
    #ifndef IMAGEVIEWER_H
    #define IMAGEVIEWER_H
     
    #include <iostream>
    #include <QMainWindow>
    #include <QApplication>
    #include <QWidget>
    #include <QtGui>
     
    class QAction;
    class QLabel;
    class QMenu;
    class QImage;
    class QScrollArea;
     
    using namespace std;
     
    class ImageViewer:public QMainWindow {
     Q_OBJECT 
     
       public:
        ImageViewer();
        ~ImageViewer();
     
       private slots:
       void open();
       void save();
     
     private:
       void createActions();
       void createMenus();
     
       QLabel *imageLabel;
     
       QScrollArea *scrollArea;
     
       QAction *openAct;
       QAction *saveAct;
       QAction *exitAct;
     
       QMenu *fileMenu;
       QMenu *ProcessingMenu;
     
       QImage *image;
     
       QString fileName;
       QString saveFile;
    };
    #endif
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
     
    #include "imageViewer.hpp"
     
    ImageViewer::ImageViewer()
    {
       imageLabel = new QLabel;
       imageLabel->setBackgroundRole(QPalette::Base);
       imageLabel->setSizePolicy(QSizePolicy::Ignored, QSizePolicy::Ignored);
       imageLabel->setScaledContents(true);
     
       scrollArea = new QScrollArea;
       scrollArea->setBackgroundRole(QPalette::Dark);
       scrollArea->setWidget(imageLabel);
       setCentralWidget(scrollArea);
     
       createActions();
       createMenus();
     
       setWindowTitle(tr("Image Viewer"));
       resize(500, 400);
    }
     
    ImageViewer::~ImageViewer()
    {
    }
     
    void
     ImageViewer::open()
    {
       fileName =
           QFileDialog::getOpenFileName(this, tr("Open File"),
                                        QDir::homePath());
     
       if (!fileName.isEmpty()) {
          image = new QImage(fileName);
     
          if (image->isNull()) {
             QMessageBox::information(this,
                                      tr("Image Viewer"),
                                      tr("Cannot load %1.").arg(fileName));
             return;
          }
     
          imageLabel->setPixmap(QPixmap::fromImage(*image));
          imageLabel->adjustSize();
       }
    }
     
    void ImageViewer::save()
    {
       saveFile =
           QFileDialog::getSaveFileName(this,
                                        tr("Save File"),
                                        QDir::currentPath(),
                                        tr("Images (*.png *.xpm *.jpg)"));
       image->save(saveFile);
    }
     
    void ImageViewer::createActions()
    {
       openAct = new QAction(tr("&Open..."), this);
       openAct->setShortcut(tr("Ctrl+O"));
       connect(openAct, SIGNAL(triggered()), this, SLOT(open())
           );
     
       saveAct = new QAction(tr("&Save..."), this);
       saveAct->setShortcut(tr("Ctrl+S"));
       connect(saveAct, SIGNAL(triggered()), this, SLOT(save())
           );
     
       exitAct = new QAction(tr("E&xit"), this);
       exitAct->setShortcut(tr("Ctrl+Q"));
       connect(exitAct, SIGNAL(triggered()), this, SLOT(close())
           );
    }
     
    void ImageViewer::createMenus()
    {
       fileMenu = new QMenu(tr("&File"), this);
       fileMenu->addAction(openAct);
       fileMenu->addAction(saveAct);
       fileMenu->addSeparator();
       fileMenu->addAction(exitAct);
     
       ProcessingMenu = new QMenu(tr("&Processing"), this);
     
       menuBar()->addMenu(fileMenu);
       menuBar()->addMenu(ProcessingMenu);
    }
    Sinon tu peux me dire comment tu écrirais le cmake parce que j'ai lu la doc j'ai l'impression que j'écris beaucoup de chose redondante.

    EDIT : Précision => mon code fonctionne très bien lorsque je fais un qmake -project ; qmake ; make, j'ai un executable qui fonctionne très bien.

  7. #7
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Voilà j'ai réussi, je mets mon CMake si cela peut aider d'autres personnes :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
    #Version Minimum utilisé
    cmake_minimum_required(VERSION 2.6)
     
    #Nom du projet
    project(ImageLoader)
     
    #Executable enregistré dans le dossier bin
    set(EXECUTABLE_OUTPUT_PATH bin/)
     
    #Ajout dans une variable des fichiers headers contenant 
    #des slots ou la macro Q_OBJECT
    set(MOC_HEADERS ./headers/imageViewer.hpp)
     
    #Mets dans la variable CMAKE_MODULE_PATH les fichiers .cmake contenu
    #dans le dossier cmake/ (fichier Findx.cmake)
    #set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
     
    #add_definitions(-Wall)
     
    #Utilisation du module Qt4 de CMake
    find_package(Qt4 REQUIRED)
     
    #Ajout du dossier headers/ aux headers pour la construction 
    include_directories(headers)
     
    #Ajout d'un fichier CMake, ici QT_USE_FILE
    include(
      ${QT_USE_FILE}
    )
     
    #Creation du code moc avec les fichiers headers contenu
    #dans la variable MOC_HEADERS
    QT4_WRAP_CPP(
      MOC_OUTFILES
      ${MOC_HEADERS}
    )
     
    #Chargement dans la variable source_file des fichiers
    #source contenu dans le dossier src/
    file(
      GLOB_RECURSE
      source_files
      ./src/*.cpp
    )
     
    #Ajout d'un executable du nom de ImageLoader construit
    #avec les sources contenu dans la variable source_files
    add_executable (
      ImageLoader
      ${source_files}
      ${MOC_OUTFILES}
    )
     
    #liaison des librairies (ici librairie Qt) avec la cible 
    #spécifié (ici ImageLoader) 
    target_link_libraries (
      ImageLoader
      ${QT_LIBRARIES}
    )

  8. #8
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Je dirais quelque chose comme ceci.
    Je ne nommerais pas la librairie libImageLoader mais plutôt ImageLoader. En effet, sous Unix, le préfixe lib est automatiquement ajouté.

    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
    29
     
    cmake_minimum_required (VERSION 2.6)
     
    project (ImageLoader)
     
    set (EXECUTABLE_OUTPUT_PATH bin/)
     
    set (MOC_HEADERS headers/imageViewer.hpp)
     
    find_package (Qt4 REQUIRED COMPONENTS QtCore QtGui)
     
    include (${QT_USE_FILE})
     
    qt4_wrap_cpp (MOC_OUTFILES ${MOC_HEADERS})
     
    include_directories (headers)
     
    file (GLOB_RECURSE source_files src/*.cpp)
     
    add_library (ImageLoader STATIC
      ${source_files}
      ${MOC_OUTFILES}
      )
     
    target_link_libraries (ImageLoader ${QT_LIBRARIES})
     
    #add_executable (imageLoader main.cpp)
     
    #target_link_libraries (imageLoader ImageLoader)

  9. #9
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    De toute façon j'ai résolu mon problème tu peux regarder mon code juste avant ton post il fonctionne très bien
    Sinon merci de t'être donné du mal pour m'aider.

  10. #10
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    Ah oui effectivement.
    On a envoyé le message à peu près en même temps, ce qui fait que je ne l'ai pas vu.

  11. #11
    Membre éclairé Avatar de AuraHxC
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Mai 2006
    Messages : 652
    Par défaut
    Pas grave merci encore
    En tout cas j'ai appris pas mal sur CMake en mangeant la doc pour réussir mon script donc c'est assez bénéfique.

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

Discussions similaires

  1. [Compilation] Qt4, Smoke, cmake, kdebindings et Perl
    Par djibril dans le forum Outils
    Réponses: 3
    Dernier message: 08/02/2011, 22h30
  2. [Qt4] Linker error (vtable)
    Par titus55 dans le forum Qt
    Réponses: 7
    Dernier message: 23/05/2007, 10h04
  3. Visual 2005 & Qt4 Opensource
    Par chkpos dans le forum MFC
    Réponses: 3
    Dernier message: 08/02/2006, 18h08
  4. Réponses: 1
    Dernier message: 28/11/2005, 23h20

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