64 votes

Comment utiliser le modèle de sous-répertoire de QMake ?

Je commence à apprendre Qt. Je quitte le monde de Visual Studio et je cherche un moyen d'organiser la structure de mon projet en utilisant QMake. J'ai trouvé le modèle 'subdirs' mais j'ai du mal à le comprendre.

La structure de mon projet ressemble à ceci :

project_dir/
    main.cpp
    project.pro
    logic/
      logic.pro
      some logic files
    gui/
      gui.pro
      gui files

Mon projet.pro ressemble à ceci

TEMPLATE = subdirs
SUBDIRS = logic \
          gui
SOURCES += main.cpp

Dans le .pro pour les sous-répertoires que j'ai appropriés. SOURCES , HEADERS y RESSOURCES l'ensemble des variables.

S'il vous plaît, dites-moi ce que CIBLE , TEMPLATE et les autres valeurs nécessaires que je dois définir dans le .pro des fichiers.

Par ailleurs, existe-t-il un bon tutoriel QMake autre que le tutoriel officiel ?

85voto

Caleb Huitt - cjhuitt Points 9764

En plus de Commentaire de Troubadour j'aimerais noter que le SUBDIRS target n'est bon que pour spécifier des sous-répertoires. Par conséquent, votre ligne supplémentaire de

SOURCES += main.cpp

dans votre fichier project.pro est incorrect, et échouera probablement à construire votre fichier main.cpp, au pire. Au mieux, qmake refusera d'analyser le fichier, puisqu'il contient des spécifications contradictoires.

J'ai utilisé le SUBDIRS et il fonctionne bien si vous pouvez construire des parties dans des bibliothèques plus ou moins indépendantes, apparemment comme vous l'avez fait avec la logique et l'interface séparée. Voici une façon de le faire :

project_dir/
-project.pro
-common.pri
-logic/
----logic.pro
----some logic files
-gui/
----gui.pro
----gui files
-build/
----build.pro
----main.cpp

projet.pro :

TEMPLATE = subdirs
SUBDIRS = logic \
          gui

# build must be last:
CONFIG += ordered
SUBDIRS += build

commun.pri :

#Includes common configuration for all subdirectory .pro files.
INCLUDEPATH += . ..
WARNINGS += -Wall

TEMPLATE = lib

# The following keeps the generated files at least somewhat separate 
# from the source files.
UI_DIR = uics
MOC_DIR = mocs
OBJECTS_DIR = objs

logique/logic.pro :

# Check if the config file exists
! include( ../common.pri ) {
    error( "Couldn't find the common.pri file!" )
}

HEADERS += logic.h
SOURCES += logic.cpp

# By default, TARGET is the same as the directory, so it will make 
# liblogic.a (in linux).  Uncomment to override.
# TARGET = target

gui/gui.pro :

! include( ../common.pri ) {
    error( "Couldn't find the common.pri file!" )
}

FORMS += gui.ui
HEADERS += gui.h
SOURCES += gui.cpp

# By default, TARGET is the same as the directory, so it will make 
# libgui.a (in linux).  Uncomment to override.
# TARGET = target

build/build.pro :

TEMPLATE = app

SOURCES += main.cpp

LIBS += -L../logic -L../gui -llogic -lgui

# Will build the final executable in the main project directory.
TARGET = ../project

17voto

Troubadour Points 9485

Vous utilisez subdirs si les dossiers logic et gui représentent en fait une sorte de cible, par exemple une bibliothèque, qui peut être construite indépendamment de tout le reste. Si c'est le cas, utilisez simplement

TEMPLATE = lib
TARGET = logic
CONFIG += dll

dans logic.pro.

S'il ne s'agit pas de cibles indépendantes mais simplement de dossiers qui existent pour organiser les fichiers sources, vous pouvez simplement utiliser un fichier .pri dans chacun d'eux et les inclure dans le .pro en utilisant

include(logic/logic.pri)
include(gui/gui.pri)

Rappelez-vous que les chemins d'accès aux fichiers .pri sont relatifs au fichier .pro et que les chemins d'accès aux fichiers .pri sont relatifs au fichier .pro. no le .pri. Par ailleurs, l'utilisation d'un fichier .pri est facultative, car vous pouvez toujours répertorier les fichiers de ces dossiers directement dans le fichier .pro. Le fichier .pri rend simplement les choses plus claires et aide à garder le fichier .pro plus court.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X