2009-09-13 8 views
59

Я начинаю изучать Qt. Я перехожу из мира Visual Studio, и я ищу способ организовать структуру моего проекта с помощью QMake. Я нашел шаблон «subdirs», но мне это трудно понять.Как использовать шаблон поддиров QMake?

Моя структура проекта выглядит следующим образом:

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 для подкаталогов У меня есть соответствующие ИСТОЧНИКОВ , ГОЛОВКИ и РЕСУРСЫ набор переменных.

Пожалуйста, скажите мне, что TARGET, ШАБЛОН и другие необходимые значения следует установить в .pro файлов.

Кроме того, есть ли какой-то хороший учебник QMake, отличный от официального?

ответ

80

В дополнение к Troubadour's comment, я хотел бы отметить, что цель SUBDIRS подходит только для указания поддиректорий. Таким образом, ваша дополнительная линия

SOURCES += main.cpp 

в вашем project.pro файла неверно, и, скорее всего, не в состоянии построить свой файл main.cpp, в худшем случае. В лучшем случае qmake откажется разбирать файл, поскольку в нем есть противоречивые спецификации.

Я использовал шаблон SUBDIRS несколько раз, и это хорошо, если вы можете создавать детали в более или менее независимых библиотеках, по-видимому, как и у вас с логикой и gui. Вот один из способов сделать это:

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 

общего.ИРП:

#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 
+0

Хороший вопрос об директиве SOURCES в project.pro. Я пропустил это полностью. – Troubadour

+0

Спасибо за этот исчерпывающий ответ. Это хороший момент, чтобы начать мое обучение. – zarzych

+0

У меня сложилось впечатление, что «заказ» является глобальным. Кажется, он не делает первые две библиотеки одновременно. –

16

Вы используете subdirs, если логические и gui-папки фактически отображают какую-то цель, например. библиотеку, которая может быть построена независимо от чего-либо еще. Если это так, то просто используйте

TEMPLATE = lib 
TARGET = logic 
CONFIG += dll 

в logic.pro.

Если они не являются независимыми объектами, но только папки, которые существуют для организации источников файлов, то вы можете просто использовать .При файл в каждом, а и включать их в .pro с использованием

include(logic/logic.pri) 
include(gui/gui.pri) 

Только помните, что пути к файлам в файлах .pri относятся к файлу .pro и не .pri. BTW, использование файла .pri является необязательным, поскольку вы все равно можете перечислить файлы в этих папках непосредственно в файле .pro. Файл .pri просто делает его более аккуратным и помогает сохранить файл .pro короче.

+2

Из того, что я «Извините, метод .pri-файла заставляет Qt Creator отображать вложенную папку для каждого .pri-файла и его cont энтов. – zarzych

+3

@zarzych: Это правда, но это также досадно не относится к тому, где .pri-файл находится в файловой системе и просто отображает их как плоский список на уровне .pro. Особенно раздражает, если у вас несколько имен с тем же именем. – Troubadour