Come usare il template dei sottodiretti di QMake?
-
07-07-2019 - |
Domanda
Sto iniziando a imparare Qt. Mi sto spostando dal mondo di Visual Studio e sto cercando un modo per organizzare la struttura del mio progetto usando QMake. Ho trovato il modello 'subdir' ma non riesco a comprenderlo.
La struttura del mio progetto è simile al seguente:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Il mio project.pro assomiglia a questo
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
Nei file .pro per le sottodirectory ho impostato le variabili SOURCES , HEADERS e RESOURCES appropriate.
Per favore, dimmi quali TARGET , MODELLO e altri valori necessari che dovrei impostare nei file .pro .
Inoltre, c'è qualche buon tutorial su QMake diverso da quello ufficiale?
Soluzione
Oltre a Commento di Troubadour , vorrei notare che l'obiettivo SUBDIRS
è utile solo per specificare le sottodirectory. Pertanto, la tua riga extra di
SOURCES += main.cpp
nel tuo file project.pro non è corretto e probabilmente non riuscirà a creare il tuo file main.cpp, nel peggiore dei casi. Nella migliore delle ipotesi, qmake rifiuterà di analizzare il file, poiché contiene specifiche contrastanti.
Ho usato il modello SUBDIRS
alcune volte, e funziona bene se puoi costruire parti in librerie più o meno indipendenti, apparentemente come hai fatto con la logica e la gui separate . Ecco un modo per farlo:
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
logica / 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
Altri suggerimenti
Usi subdir
se le cartelle della logica e della gui rappresentano effettivamente una sorta di target, ad es. una biblioteca, che può essere costruita indipendentemente da qualsiasi altra cosa. In tal caso, utilizza semplicemente
TEMPLATE = lib
TARGET = logic
CONFIG += dll
in logic.pro.
Se non sono destinazioni indipendenti ma sono solo cartelle esistenti per organizzare i file di origine, è possibile utilizzare un file .pri in ciascuno di essi e includerli all'interno di .pro utilizzando
include(logic/logic.pri)
include(gui/gui.pri)
Ricorda solo che i percorsi dei file nei file .pri sono relativi al file .pro e non al .pri. A proposito, l'uso di un file .pri è facoltativo in quanto è ancora possibile elencare i file in quelle cartelle direttamente nel file .pro. Il file .pri lo rende un po 'più ordinato e aiuta a ridurre il file .pro.