Wie QMake der subdirs Vorlage verwenden?
-
07-07-2019 - |
Frage
Ich fange Qt zu lernen. Ich bin aus der Visual Studio Welt bewegen, und ich bin auf der Suche nach einer Möglichkeit, meine Projektstruktur mit QMake zu organisieren. Ich habe die ‚subdirs‘ Vorlage gefunden, aber ich habe ziemlich schwer, es zu verstehen.
Meine Projektstruktur sieht folgendermaßen aus:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Mein project.pro sieht wie folgt aus
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
In den .pro Dateien für die Unterverzeichnisse I entsprechend haben Quellen HEADERS und RESOURCES Variablen gesetzt.
Bitte sagen Sie mir, was TARGET TEMPLATE und andere notwendige Werte, die ich in den .pro Dateien setzen soll.
Außerdem gibt es einige gute QMake Tutorial andere als die offizielle?
Lösung
Neben Troubadour Kommentar , würde ich beachten dass das SUBDIRS
Ziel ist für die Angabe Verzeichnisse nur gut. Daher Ihre zusätzliche Zeile von
SOURCES += main.cpp
in Ihrer project.pro Datei falsch ist, und wird wahrscheinlich nicht Ihre main.cpp-Datei erstellen, im schlimmsten Fall. Am besten, qmake wird sich weigern, die Datei zu analysieren, da es widersprüchliche Angaben in ihm hat.
Ich habe die SUBDIRS
Vorlage ein paar Mal verwendet, und es tut gut, wenn Sie Teile in mehr oder weniger unabhängige Bibliotheken aufbauen können, scheinbar wie haben Sie mit der Logik und der gui getrennt. Hier ist eine Möglichkeit, dies zu tun:
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
common.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
Logik / 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
gui / 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
Andere Tipps
Sie verwenden subdirs
, wenn die Logik und GUI-Ordner tatsächlich eine Art von Ziel repesent, zum Beispiel. eine Bibliothek, die unabhängig von irgendetwas anderes gebaut werden kann. Wenn das der Fall ist, dann benutzen Sie einfach
TEMPLATE = lib
TARGET = logic
CONFIG += dll
in logic.pro.
Wenn sie nicht unabhängig Ziele sind, sondern nur Ordner, die die Quellen-Dateien zu organisieren existieren, dann können Sie nur eine PRI-Datei in jedem stattdessen verwenden und schließen sie innerhalb der .pro mit
include(logic/logic.pri)
include(gui/gui.pri)
Bitte beachten Sie, dass die Dateipfade in den PRI-Dateien sind relativ zur .proDatei und nicht der .pri. BTW, ist die Verwendung einer PRI-Datei ist optional, da Sie immer noch die Dateien in diesen Ordnern direkt in der .pro-Datei auflisten können. Die PRI-Datei es nur macht das sauberere Bit und hilft, die .proDatei kürzer.