Como usar o modelo de subdiretórios do QMake?
-
07-07-2019 - |
Pergunta
Estou começando a aprender Qt. Eu estou movendo do mundo Visual Studio e eu estou procurando uma maneira de organizar a estrutura do meu projeto usando QMake. Eu encontrei o modelo 'subdirs' mas eu tenho bastante dificuldade em entender isso.
As minhas estrutura do projeto se parece com isso:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Meu project.pro olhares como este
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
No .pro arquivos para os subdiretórios tenho apropriada FONTES , HEADERS e RECURSOS variáveis ??definido.
Por favor me diga o TARGET , template e outros valores necessários devo definidas no .pro arquivos.
Além disso, há alguma boa QMake tutorial diferente daquele oficial?
Solução
Além do Troubadour comentário , gostaria de observar que o alvo SUBDIRS
só é bom para especificar subdiretórios. Portanto, sua linha extra de
SOURCES += main.cpp
em seu arquivo project.pro é incorreto, e provavelmente irá falhar para construir seu arquivo de main.cpp, na pior das hipóteses. Na melhor das hipóteses, qmake se recusará a analisar o arquivo, uma vez que tem conflitantes especificações nele.
Eu usei o modelo SUBDIRS
algumas vezes, e ele faz bem se você pode construir peças em bibliotecas mais ou menos independentes, aparentemente como você tem com a lógica e os gui separar. Aqui está uma maneira de fazer isso:
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
lógica / 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
Outras dicas
Você usa subdirs
se as pastas de lógica e gui realmente repesent algum tipo de alvo, por exemplo. uma biblioteca, que pode ser construído de forma independente de qualquer outra coisa. Se for esse o caso, então é só usar
TEMPLATE = lib
TARGET = logic
CONFIG += dll
em logic.pro.
Se eles não são alvos independentes, mas são apenas pastas que existem para organizar os arquivos fontes, então você pode apenas usar um arquivo .pri em cada vez e incluí-los dentro do .pro usando
include(logic/logic.pri)
include(gui/gui.pri)
Basta lembrar que os caminhos de arquivo nos arquivos .pri são em relação ao arquivo .pro e não o .pri. BTW, o uso de um arquivo .pri é opcional, você ainda pode listar os arquivos das pastas diretamente no arquivo .pro. O arquivo .pri apenas que o torna pouco mais limpa e ajuda a manter o arquivo .pro mais curto.