web-dev-qa-db-fra.com

Comment spécifier différents répertoires de sortie Debug / Release dans le fichier QMake .pro

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?

101
Etienne Savard

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.

4
Kuba Ober

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! :)

146
mosg

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 () ).

49
chalup

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
41
Hello W

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"
}
13
Sulla

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
10
hyde

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.

3
Steve Besch

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 }
1
BuvinJ