¿Cómo usar la plantilla subdire de QMake?
-
07-07-2019 - |
Pregunta
Estoy empezando a aprender Qt. Me estoy mudando del mundo de Visual Studio y estoy buscando una forma de organizar la estructura de mi proyecto usando QMake. He encontrado la plantilla 'subdireccionar' pero me cuesta mucho entenderla.
La estructura de mi proyecto se ve así:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Mi project.pro tiene este aspecto
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
En los archivos .pro para los subdirectorios tengo el conjunto de variables FUENTES , HEADERS y RECURSOS apropiados.
Por favor, dígame qué OBJETIVO , PLANTILLA y otros valores necesarios que debo establecer en los archivos .pro .
Además, ¿hay algún buen tutorial de QMake que no sea el oficial?
Solución
Además de comentario del trovador , quisiera señalar que el objetivo SUBDIRS
solo es bueno para especificar subdirectorios. Por lo tanto, su línea adicional de
SOURCES += main.cpp
en su archivo project.pro es incorrecto, y probablemente no pueda construir su archivo main.cpp, en el peor de los casos. En el mejor de los casos, qmake se negará a analizar el archivo, ya que tiene especificaciones contradictorias.
He usado la plantilla SUBDIRS
varias veces, y funciona bien si puedes construir partes en bibliotecas más o menos independientes, aparentemente como lo has hecho con la lógica y la interfaz gráfica de usuario separadas . Aquí hay una forma de hacer esto:
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
logic / 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
Otros consejos
Usas subdirs
si las carpetas de lógica y gui realmente repelen algún tipo de objetivo, por ejemplo. Una biblioteca, que se puede construir independientemente de cualquier otra cosa. Si ese es el caso, simplemente use
TEMPLATE = lib
TARGET = logic
CONFIG += dll
en logic.pro.
Si no son objetivos independientes sino que son carpetas que existen para organizar los archivos de origen, puede usar un archivo .pri en cada uno e incluirlos dentro del .pro usando
include(logic/logic.pri)
include(gui/gui.pri)
Solo recuerde que las rutas de los archivos .pri son relativas al archivo .pro y no al .pri. Por cierto, el uso de un archivo .pri es opcional, ya que aún puede enumerar los archivos en esas carpetas directamente en el archivo .pro. El archivo .pri lo hace un poco más ordenado y ayuda a mantener el archivo .pro más corto.