2009-09-13 9 views
59

Je commence à apprendre Qt. Je quitte le monde 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.Comment utiliser le modèle de sous-répertoires de QMake?

Ma structure de projet ressemble à ceci:

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

Mon project.pro ressemble à ce

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

Dans les .pro fichiers pour les sous-répertoires I ont SOURCES appropriées , EN-TÊTE et RESSOURCES jeu de variables.

S'il vous plaît me dire ce que TARGET, TEMPLATE et d'autres valeurs nécessaires je mettre dans les .pro fichiers.

De plus, existe-t-il un bon tutoriel QMake autre que celui officiel?

Répondre

80

En plus de Troubadour's comment, je note que la cible SUBDIRS est seulement bon pour spécifier des sous-répertoires. Par conséquent, votre ligne supplémentaire dans votre fichier project.pro de

SOURCES += main.cpp 

est incorrect, et échouera probablement construire votre fichier main.cpp, au pire. Au mieux, qmake refusera d'analyser le fichier, car il contient des spécifications contradictoires. J'ai utilisé le modèle SUBDIRS à plusieurs reprises, et cela fonctionne bien si vous pouvez construire des parties dans des bibliothèques plus ou moins indépendantes, apparemment comme vous avez avec la logique et le gui séparé. 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 

project.pro:

TEMPLATE = subdirs 
SUBDIRS = logic \ 
      gui 

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

commune.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 

IUG/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 
+0

Bon point sur la directive SOURCES dans project.pro. Cela m'a complètement manqué. – Troubadour

+0

Merci pour cette réponse complète. C'est un bon point pour commencer mon apprentissage. – zarzych

+0

J'ai l'impression que "commandé" est global. Il ne semble pas faire les deux premières bibliothèques simultanément. –

16

Vous utilisez subdirs si les dossiers logiques et graphiques représentent réellement une sorte de cible, par ex. une bibliothèque, qui peut être construite indépendamment de toute autre chose. Si c'est le cas, il suffit d'utiliser

TEMPLATE = lib 
TARGET = logic 
CONFIG += dll 

dans logic.pro.

Si elles ne sont pas des cibles indépendantes mais sont simplement des dossiers qui existent pour organiser les fichiers sources, vous pouvez simplement utiliser un fichier .pri dans chaque lieu et les inclure dans le .pro en utilisant

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

Rappelez-vous que les chemins de fichier dans les fichiers .pri sont relatifs au fichier .pro et pas le .pri. BTW, l'utilisation d'un fichier .pri est facultatif car vous pouvez toujours lister les fichiers dans ces dossiers directement dans le fichier .pro. Le fichier .pri rend juste ce bit un peu plus propre et aide à garder le fichier .pro plus court.

+2

D'après ce que je 'ai appris, la méthode de fichier .pri provoque Qt Creator pour afficher le sous-dossier pour chaque fichier .pri et son cont ents. – zarzych

+3

@zarzych: Cela est vrai, mais il ne respecte pas non plus l'emplacement du fichier .pri dans le système de fichiers et ne les affiche que sous la forme d'une liste à plat au niveau .pro. Particulièrement agaçant si vous en avez plusieurs avec le même nom. – Troubadour

Questions connexes