wake-up-neo.com

Angeben verschiedener Debug / Release-Ausgabeverzeichnisse in der QMake .pro-Datei

Ich habe ein Qt-Projekt und möchte Kompilierungsdateien außerhalb des Quellbaums ausgeben.

Ich habe derzeit die folgende Verzeichnisstruktur:

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

Je nach Konfiguration (Debug/Release) möchte ich die resultierenden Dateien im Build-Verzeichnis unter Build/Debug oder Build/Release-Verzeichnisse ausgeben.

Wie kann ich das mit einer .pro-Datei machen?

101
Etienne Savard

Die kurze Antwort lautet: Sie nicht.

Sie sollten qmake gefolgt von make in dem Build-Verzeichnis ausführen, in das Sie bauen möchten. Führen Sie es also einmal in einem debug -Verzeichnis aus, einmal in einem release Verzeichnis.

So würde jeder, der ein Projekt erstellt, erwarten, dass es funktioniert, und so wird Qt selbst erstellt. So erwartet Qt Creator auch Ihr .pro Zu verhaltende Datei: Startet einfach qmake und dann make im Erstellungsordner für die von Ihrem Ziel gewählte Konfiguration.

Wenn Sie diese Ordner erstellen und die zwei (oder mehr) Builds in ihnen ausführen möchten, benötigen Sie ein Makefile der obersten Ebene, das möglicherweise aus einer Projektdatei der obersten Ebene über qmake erstellt wurde.

Es ist nicht ungewöhnlich, dass mehr als zwei Build-Konfigurationen vorhanden sind. Sie verpflichten sich daher unnötigerweise, nur zwischen einem Build und einem Release zu unterscheiden. Möglicherweise haben Sie Builds mit unterschiedlichen Optimierungsstufen usw. Die Zweiteilung zwischen Debuggen und Freigeben sollten Sie am besten in Ruhe lassen.

4
Kuba Ober

Für mein Qt-Projekt verwende ich dieses Schema in der * .pro-Datei:

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

Es ist einfach, aber schön! :)

146
mosg

Um das Verzeichnis für die Ziel-DLL/Exe zu ändern, verwenden Sie dies in Ihrer Pro-Datei:

CONFIG(debug, debug|release) {
    DESTDIR = build/debug
} else {
    DESTDIR = build/release
}

Möglicherweise möchten Sie auch die Verzeichnisse für andere Build-Ziele wie Objektdateien und MOC-Dateien ändern (prüfen Sie qmake-Variablenreferenz für Details oder qmake-CONFIG () - Funktionsreferenz ).

49
chalup

Ich habe einen kompakteren Ansatz:

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

Ich benutze die gleiche Methode von Chalup vorgeschlagen,

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

Alte Frage, aber immer noch eine aktuelle Antwort wert. Heutzutage ist es üblich, das zu tun, was Qt Creator macht, wenn Schattenbuilds verwendet werden (diese sind beim Öffnen eines neuen Projekts standardmäßig aktiviert).

Für jedes Build-Ziel und jeden Build-Typ wird das richtige qmake mit den richtigen Argumenten in einem anderen Build-Verzeichnis ausgeführt. Dann wird das einfach mit make gebaut.

So könnte eine imaginäre Verzeichnisstruktur aussehen.

/
|_/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

Und das Wichtigste ist, dass im Build-Verzeichnis ein qmake ausgeführt wird:

cd build-mylib-XXXX
/path/to/right/qmake ../mylib/mylib.pro CONFIG+=buildtype ...

Dann werden Makefiles im Build-Verzeichnis erzeugt, und dann erzeugt make auch Dateien darunter. Es besteht kein Risiko, dass verschiedene Versionen verwechselt werden, solange qmake nie im Quellverzeichnis ausgeführt wird (wenn dies der Fall ist, sollten Sie es gut bereinigen!).

Und wenn das so gemacht ist, wird der .pro Datei aus aktuell akzeptierter Antwort ist noch einfacher:

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

Es ist auch nützlich, der ausführbaren Datei einen etwas anderen Namen zu geben. Sie können nicht so etwas verwenden:

release: Target = ProgramName
debug: Target = ProgramName_d

Warum es nicht funktioniert, ist nicht klar, aber es funktioniert nicht. Aber:

CONFIG(debug, debug|release) {
    TARGET = ProgramName
} else {
    TARGET = ProgramName_d
}

Dies funktioniert solange der CONFIG += Zeile steht davor.

3
Steve Besch

Die neue Version von Qt Creator hat auch eine "Profil" -Erstellungsoption zwischen Debug und Release. So entdecke ich das:

CONFIG(debug, debug|release) {  DEFINES += DEBUG_MODE }
else:CONFIG(force_debug_info) { DEFINES += PROFILE_MODE }
else {                          DEFINES += RELEASE_MODE }
1
BuvinJ