114 votes

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

J'ai un projet Qt et je voudrais sortir les fichiers de compilation en dehors de l'arbre des sources.

J'ai actuellement la structure de répertoire suivante :

/
|_/build
|_/mylib
  |_/include
  |_/src
  |_/resources

Selon la configuration (debug/release), j'aimerai sortir les fichiers résultants à l'intérieur du répertoire de construction sous les répertoires build/debug ou build/release.

Comment puis-je faire cela en utilisant un fichier .pro ?

0 votes

La façon dont Qt traite les builds de débogage et de version a changé au fil du temps. Nous avons donc découvert que les commutations précédentes entre debug et release ne fonctionnaient plus dans les versions ultérieures. Voir ma solution qui fonctionne sur toutes les plateformes et sur toutes les versions de Qt jusqu'à présent. stackoverflow.com/questions/32046181/

2 votes

Puisqu'il s'agit d'une vieille question, il est bon de rappeler qu'il y a de meilleures réponses avec beaucoup moins de votes.

159voto

mosg Points 5271

Pour mon projet Qt, j'utilise ce schéma dans le 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 sympa :)

18 votes

Juste ce dont j'avais besoin ! Et une note : Pour rendre les choses encore plus faciles à changer, définissez seulement votre DESTDIR de manière conditionnelle, puis utilisez cette valeur dans tous vos autres chemins : OBJECTS_DIR = $${DESTDIR}/.obj . A la vôtre !

4 votes

Pouvez-vous expliquer comment cela est utilisé / ce que cela fait ? Il semble n'avoir aucun effet lorsque je le mets en œuvre. éditer : Si je change Debug en debug (minuscule), cela fonctionne. Je pense que c'est une question de sensibilité à la casse entre Windows et Unix.

12 votes

Je l'ai voté car il fonctionne sous Windows. Sous Linux (Ubuntu 15.04, Qt 5.5.0) j'ai dû modifier Debug a debug y Release a release .

60voto

chalup Points 4215

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 changer les répertoires pour d'autres cibles de construction comme les fichiers d'objets et les fichiers moc (vérifiez l'onglet Référence de la variable qmake pour plus de détails ou Référence de la fonction CONFIG() de qmake ).

5 votes

Mais j'ai trouvé qu'il était beaucoup plus agréable d'inclure $$OUT_PWD dans ceci, ainsi DESTDIR=$$OUT_PWD/debug

1 votes

@Ivo : Ah ! Merci ! J'ai cherché partout quelle variable contenait ce chemin ! :D

1 votes

Après cela, vous pouvez ajouter des lignes comme : OBJECTS_DIR = $$DESTDIR/.obj MOC_DIR = $$DESTDIR/.moc RCC_DIR = $$DESTDIR/.qrc UI_DIR = $$DESTDIR/.ui CONFIG() s'avère résoudre certains problèmes liés à l'utilisation release: y debug:

45voto

Hello W Points 189

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

2 votes

Votre réponse est la manière la plus récente de mettre la sortie de compilation dans un répertoire séparé.

1 votes

Avez-vous essayé cela récemment pour les deux versions, debug et release ? mon résultat de construction semble toujours se retrouver dans le dossier release, quelle que soit la configuration ; le comportement de qmake / Qt Creator a peut-être changé depuis que vous avez posté cette réponse cependant...

1 votes

Essayez d'ajouter "CONFIG -=debug" aux arguments supplémentaires de qmake en mode Release.

12voto

Sulla Points 1748

J'utilise la même méthode que celle 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"
}

12voto

hyde Points 13720

Vieille question, mais qui mérite toujours une réponse actualisée. Aujourd'hui, il est courant de faire ce que Qt Creator fait lorsque les shadow builds sont utilisés (ils sont activés par défaut lors de l'ouverture d'un nouveau projet).

Pour chaque cible et type de construction différents, le droit qmake est exécuté avec les bons arguments dans un répertoire de construction différent. Ensuite, il est juste construit avec de simples make .

Ainsi, une 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 ce qui est improbable, 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 fichiers makefiles dans le répertoire de construction, et ensuite make générera également des fichiers sous ce nom. Il n'y a pas de risque de mélange de versions différentes, tant que qmake n'est jamais exécuté dans le répertoire des sources (si c'est le cas, il vaut mieux bien le nettoyer !).

Et quand c'est fait comme ça, le .pro de la réponse actuellement acceptée est encore plus simple :

HEADERS += src/dialogs.h
SOURCES += src/main.cpp \
           src/dialogs.cpp

0 votes

Cela fonctionne bien pour un seul projet, mais qu'en est-il si vous avez un projet et une bibliothèque ? Vous avez alors besoin d'un moyen dépendant du type de construction pour inclure la bibliothèque.

0 votes

@Adversus Je ne suis pas sûr de ce que vous voulez dire exactement, mais peut-être que la variable Qmake $(OUT_PWD) est la solution ?

0 votes

Si j'applique ma question à votre exemple, elle devient : quelle est la manière la plus propre pour une application de récupérer les données de l'entreprise ? mylib ? J'aimerais qu'il y ait une façon "gracieuse" de le faire, je ne vois pas d'autre moyen que d'utiliser les techniques des autres réponses : utiliser le type de construction et la configuration pour faire le plein. LIBS de manière intelligente, annulant l'avantage de la construction en ombre.

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