qt - ¿Cómo usar la plantilla de subdirectorios de QMake?
subdirs (2)
Estoy empezando a aprender Qt. Me estoy moviendo del mundo de Visual Studio y estoy buscando una forma de organizar la estructura de mi proyecto usando QMake. Encontré la plantilla ''subdirectorios'', pero me cuesta bastante entenderla.
Mi estructura de proyecto se ve así:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Mi project.pro se parece a esto
TEMPLATE = subdirs
SUBDIRS = logic /
gui
SOURCES += main.cpp
En los archivos .pro para los subdirectorios, tengo las variables apropiadas SOURCES , HEADERS y RESOURCES .
Por favor, dígame qué TARGET , TEMPLATE y otros valores necesarios debo establecer en los archivos .pro .
Además, ¿hay algún buen tutorial de QMake aparte del oficial?
Además del comentario de Troubadour , señalaría que el objetivo SUBDIRS
solo sirve para especificar subdirectorios. Por lo tanto, su línea adicional de
SOURCES += main.cpp
en su archivo project.pro es incorrecto, y probablemente no logre construir su archivo main.cpp, en el peor. En el mejor de los casos, qmake se negará a analizar el archivo, ya que contiene especificaciones contradictorias.
He usado la plantilla SUBDIRS
varias veces, y funciona bien si puedes construir partes en bibliotecas más o menos independientes, al parecer como lo has hecho con la lógica y la interfaz gráfica separadas. Aquí hay una manera 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
subdirs
si las carpetas de lógica y gui realmente representan algún tipo de objetivo, ej. una biblioteca, que se puede construir independientemente de cualquier otra cosa. Si ese es el caso, solo usa
TEMPLATE = lib
TARGET = logic
CONFIG += dll
en logic.pro.
Si no son objetivos independientes, sino solo carpetas que existen para organizar los archivos de fuentes, puede utilizar un archivo .pri en cada uno e incluirlos en .pro usando
include(logic/logic.pri)
include(gui/gui.pri)
Solo recuerde que las rutas de archivos en los archivos .pri son relativas al archivo .pro y no al .pri. Por cierto, el uso de un archivo .pri es opcional, ya que puede seguir enumerando 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.