Предисловие

Разделение функционала по подпроектам.

Когда проект разрастается и начинает затрудняться в первую очередь ориентация что/где находится, во вторых начинает долго пересобираться проект. Все это приводит к желанию как-то логично разделить проект по функционалу и вынести все в отдельные подпроекты.

Что мы имеем в qmake. В первую очередь это TEMPLATE = SUBDIRS. Точками входа (узлами) являются pro файлы.

Пртмечание: по такому принципу же построены и сами qt исходники.

SUBDIRS могут быть и вложенными друг в друга.

У SUBDIRS может быть только один APP проект, остальные должны быть библиотеками, что логично.

И второй вариант разделения на основе include(*.pri). Инклуды также можно вкладывать друг в друга.

В SUBDIRS можно определять последовательность сборки файлов. В include на самом деле это не очевидно.

Конечно сначала всегда самый первый проект надо делать как SUBDIRS и далее в нем создать несколько подпроектов на основе pro файлов. Это если вы хотите иметь один APP и несколько внешних библиотек.

В этом случае появляется возможность пересобирать подпроекты независимо: (qmake, rebuild) можно делать отдельно для каждого pro файла.

subdirs удобны еще тем, что визуально subdirs подпроекты строятся как ветки (деревья) которые можно раскрывать/закрывать в визуальной среде Qt Creator.

include(...pri) по сути просто включения, как макросы в с++. Они добавляют в визуальном дереве проекта узлы, но на одном уровне с текущим pro файлом, которому они принадлежат.

Все, что было описано выше это инструмент.

На самом деле самое трудное это далее логично разделить функционал программы по файлам и разнести файлы по своим подпроектам.

Например исходники Qt 4.8.1 src.pro разделены по принципу один верхний subdirs и далее в каждом подроекте несколько инклудов.

Далее применяется принцип зависимости последовательности сборки подпроектов и получается так, что нельзя например собрать QtNetwork без предварительной сборки QtCore.

И еще в качестве результата сборки подпроекта subdirs получается библиотека и только один подпроект в subdirs может быть TEMPLATE = APP, в котором есть файл main.c.

Примечание: может показаться хорошей идеей вкладывать проекты в другие проекты, создавая несколько уровней вложенности, но на практике лучше этим не увлекаться. Ибо если возникнет трудно выводимая проблема надо будет скорее всего всю иерархию разбирать в плоскость.

Таким образом делаем как исходники самого Qt. Первый subdirs, далее 8..10 подпроектов, в которых инклюдами подключается функционал на одном уровне в файловой ситеме, то есть уже без вложенностей.