Как использовать шаблон подкаталогов QMake?
Я начинаю изучать Qt. Я переезжаю из мира Visual Studio и ищу способ организовать структуру моего проекта с помощью QMake. Я нашел шаблон 'subdirs', но мне трудно понять его.
Моя структура проекта выглядит так:
project_dir/
main.cpp
project.pro
logic/
logic.pro
some logic files
gui/
gui.pro
gui files
Мой project.pro выглядит так
TEMPLATE = subdirs
SUBDIRS = logic \
gui
SOURCES += main.cpp
В .pro файлах для подкаталогов у меня установлены соответствующие переменные SOURCES, HEADERS и RESOURCES.
Пожалуйста, скажите мне, какие TARGET, TEMPLATE и другие необходимые значения я должен установить в .pro файлах.
Кроме того, есть ли хорошее руководство по QMake, кроме официального?
2 ответа
В дополнение к комментарию Трубадура я хотел бы отметить, что SUBDIRS
target подходит только для указания подкаталогов. Поэтому ваша дополнительная линия
SOURCES += main.cpp
в вашем файле project.pro неверно, и в худшем случае, скорее всего, не удастся создать файл main.cpp. В лучшем случае qmake откажется анализировать файл, так как в нем есть противоречивые спецификации.
Я использовал SUBDIRS
шаблонов несколько раз, и это хорошо, если вы можете встраивать части в более или менее независимые библиотеки, очевидно, как у вас с логикой и графическим интерфейсом. Вот один из способов сделать это:
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.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.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.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
если папки логики и графического интерфейса действительно не соответствуют какой-либо цели, например. библиотека, которая может быть построена независимо от чего-либо еще. Если это так, то просто используйте
TEMPLATE = lib
TARGET = logic
CONFIG += dll
в logic.pro.
Если они не являются независимыми целями, а являются просто папками, которые существуют для организации исходных файлов, тогда вы можете просто использовать вместо них файл.pri и включать их в.pro, используя
include(logic/logic.pri)
include(gui/gui.pri)
Просто помните, что пути к файлам в файлах.pri относятся к файлу.pro, а не к.pri. Кстати, использование файла.pri не является обязательным, так как вы можете перечислить файлы в этих папках непосредственно в файле.pro. Файл.pri просто делает его более аккуратным и помогает сократить размер файла.pro.