J'ai un projet Qt et j'aimerais sortir des fichiers de compilation en dehors de l'arbre source.
J'ai actuellement la structure de répertoire suivante:
/
|_/build
|_/mylib
|_/include
|_/src
|_/resources
En fonction de la configuration (debug/release), j'aimerais sortir les fichiers résultants dans le répertoire de construction sous les répertoires build/debug ou build/release.
Comment puis-je faire cela en utilisant un fichier .pro?
La réponse courte est: vous ne le faites pas.
Vous devez exécuter qmake
suivi de make
dans le répertoire de construction dans lequel vous voulez construire. Donc, exécutez-le une fois dans un répertoire debug
, une fois dans un release
répertoire.
C'est ainsi que quiconque construisant votre projet s'attend à ce que cela fonctionne, et c'est comme ça que Qt est lui-même configuré pour construire, c'est aussi comme ça que Qt Creator attend votre .pro
fichier à se comporter: il démarre simplement qmake
puis make
dans le dossier de construction de la configuration choisie par votre cible.
Si vous souhaitez créer ces dossiers et effectuer leurs deux (ou plus) constructions, vous aurez besoin d'un fichier makefile de niveau supérieur, éventuellement créé à partir d'un fichier de projet de niveau supérieur via qmake.
Il n’est pas rare d’avoir plus de deux configurations de build, vous vous engagez donc inutilement à ne faire que différencier une compilation d’une version; vous pouvez avoir des versions avec différents niveaux d’optimisation, etc. Il est préférable de laisser la dichotomie de débogage/libération reposer en paix.
Pour mon projet Qt, j'utilise ce schéma dans un fichier * .pro:
HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
src/dialogs.cpp
Release:DESTDIR = release
Release:OBJECTS_DIR = release/.obj
Release:MOC_DIR = release/.moc
Release:RCC_DIR = release/.rcc
Release:UI_DIR = release/.ui
Debug:DESTDIR = debug
Debug:OBJECTS_DIR = debug/.obj
Debug:MOC_DIR = debug/.moc
Debug:RCC_DIR = debug/.rcc
Debug:UI_DIR = debug/.ui
C'est simple, mais gentil! :)
Pour changer le répertoire de la dll/exe cible, utilisez ceci dans votre fichier pro:
CONFIG(debug, debug|release) {
DESTDIR = build/debug
} else {
DESTDIR = build/release
}
Vous pouvez également vouloir modifier les répertoires d'autres cibles de construction, comme les fichiers objet et les fichiers moc (vérifiez référence de variable qmake pour plus de détails ou référence de fonction qmake CONFIG () ).
J'ai une approche plus compacte:
release: DESTDIR = build/release
debug: DESTDIR = build/debug
OBJECTS_DIR = $$DESTDIR/.obj
MOC_DIR = $$DESTDIR/.moc
RCC_DIR = $$DESTDIR/.qrc
UI_DIR = $$DESTDIR/.ui
J'utilise la même méthode suggérée par chalup,
ParentDirectory = <your directory>
RCC_DIR = "$$ParentDirectory\Build\RCCFiles"
UI_DIR = "$$ParentDirectory\Build\UICFiles"
MOC_DIR = "$$ParentDirectory\Build\MOCFiles"
OBJECTS_DIR = "$$ParentDirectory\Build\ObjFiles"
CONFIG(debug, debug|release) {
DESTDIR = "$$ParentDirectory\debug"
}
CONFIG(release, debug|release) {
DESTDIR = "$$ParentDirectory\release"
}
Ancienne question, mais mérite toujours une réponse à jour. Aujourd'hui, il est courant de faire ce que Qt Creator fait lorsque des versions shadow sont utilisées (elles sont activées par défaut lors de l'ouverture d'un nouveau projet).
Pour chaque type et cible de construction, le droit qmake
est exécuté avec les arguments corrects dans un répertoire de construction différent. Ensuite, cela est simplement construit avec make
simple.
Ainsi, la structure de répertoire imaginaire pourrait ressembler à ceci.
/
|_/build-mylib-qt5-mingw32-debug
|_/build-mylib-qt5-mingw32-release
|_/build-mylib-qt4-msvc2010-debug
|_/build-mylib-qt4-msvc2010-release
|_/build-mylib-qt5-arm-debug
|_/build-mylib-qt5-arm-release
|_/mylib
|_/include
|_/src
|_/resources
Et l'important c'est qu'un qmake
est exécuté dans le répertoire de construction:
cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...
Ensuite, il génère des makefiles dans le répertoire de construction, puis make
génère également des fichiers. Il n’ya aucun risque que des versions différentes soient mélangées, tant que qmake n’est jamais exécuté dans le répertoire source (le cas échéant, mieux vaut le nettoyer correctement!).
Et quand c'est fait comme ça, le fichier .pro
De la réponse actuellement acceptée est encore plus simple:
HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
src/dialogs.cpp
Il est également utile d’avoir un nom légèrement différent pour l’exécutable de sortie. Vous ne pouvez pas utiliser quelque chose comme:
release: Target = ProgramName
debug: Target = ProgramName_d
Pourquoi cela ne fonctionne pas n'est pas clair, mais ce n'est pas le cas. Mais:
CONFIG(debug, debug|release) {
TARGET = ProgramName
} else {
TARGET = ProgramName_d
}
Cela fonctionne aussi longtemps que le CONFIG +=
la ligne le précède.
La nouvelle version de Qt Creator a également une option de construction "profile" entre le débogage et la publication. Voici comment je détecte cela:
CONFIG(debug, debug|release) { DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else { DEFINES += RELEASE_MODE }