qmake позволяет включать в файл проекта другие файлы в синтаксисе .pro файла с помощью команды include
. Работает она практически аналогично директиве #include
препроцессора C/C++: содержимое указанного файла вставляется в месте написания include
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
# можно вынести общие настройки для группы проектов, # например свои функции, в один общий файл include(../common.pri) # можно разбить проект на части, и каждую # часть вести в своем каталоге include(subsystem1/subsystem1.pri) include(subsystem2/subsystem2.pri) # можно прописать настройки по подключению своих # статических библиотек в специальном месте, # и подключать их к проекту одной строкой include(d:/projects/libs/my_library.pri) |
Расширение .pri для включаемых файлов необязательно, это просто устоявшаяся традиция для обозначения подключаемых файлов, которые не являются самостоятельными файлами проектов.
Путь к включаемому файлу должен быть или абсолютным, или относительным. Относительно чего? Текущего обрабатываемого qmake’ом файла, т.е. относительно того файла, в котором написан include
. Это обычная для qmake интерпретация относительных путей. В связи с таким поведением qmake возникает вопрос: как быть, если проект разбит на подкаталоги, которые тоже могут быть разбиты на подкаталоги, каждый такой каталог обслуживается своим .pri файлом, и нужно в них во всех включать какой-нибудь common.pri
, который лежит рядом .pro файлом? Относительные пути использовать неудобно из-за разных уровней вложенности каталогов, абсолютный путь — это тоже, мягко говоря, некрасиво.
Для решения такого рода вопросов существует встроенная переменная _PRO_FILE_PWD_
, которая содержит путь к каталогу самого первого файла, который начал обрабатывать qmake, т.е. к каталогу .pro файла. С ее помощью всегда можно вычислить абсолютный путь к файлам вроде common.pri
:
1 2 3 4 5 |
# part/subpart/subsubpart/subsubpart.pri # вместо include(../../../common.pri) include($${_PRO_FILE_PWD_}/common.pri) |
Условный include
Если включаемый файл не будет найден, qmake не завершиться с ошибкой, но выдаст предупреждение (warning). Если нужно, такие ситуации можно обрабатывать самостоятельно, используя include
в условной форме:
1 2 3 4 5 6 |
!include(lib1.pri) { # обработка ошибки, например включение заменяющего файла include(lib2.pri) } |
include в функциях пользователя
К сожалению, include в qmake работает уж слишком как в препроцессоре C, что сильно ограничивает применение include в функциях пользователя.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
# файл include.pri A = 1 B = 2 # файл project.pro defineReplace(testInclude) { include(include.pri) export(A) return(0) } $$testInclude() message($$A) # 1 message($$B) # пусто... |
Так что если не знать заранее, какие переменные включаются, чтобы их сэкспортить наружу функции, include в функциях бесполезен. Я уже молчу от вариантах, когда внутри включаемого файла, например, функция пользователя определяется…
include с префиксом
Для истинных любителей поизвращаться у функции include есть второй параметр, который задает произвольный префикс для всего, что включается:
1 2 3 4 5 6 7 8 9 10 |
# файл include.pri A = 10 # файл project.pro include(include.pri, prefix) message($$prefix.A) # 10 |
Лично я пока не нашел применений для этой фичи 😉
include и Qt Creator

Отображение исходников, разбитых на подкаталоги
По своей идеологии сайдбар Projects в Qt Creator показывает структуру проекта, а не файловую организацию исходников. В частности, заголовочные файлы показываются отдельно, исходники — отдельно. И это очень неудобно получается в том случае, если исходные файлы лежат в разных каталогах, т.к. разбиение исходников на каталоги делается, как правило, для разделения проекта на модули. В результате исходные файлы одного модуля оказываются в разных — и весьма друг от друга удаленных — местах.
«Вылечить» это неудобство можно, если использовать .pri файлы для подкаталогов модулей. Qt Creator полностью поддерживает такую идиому: и отображает правильно, и добавлять файлы в каталог модуля по контекстному меню умеет. Все, что нужно — это создать пустые .pri файлы в нужных каталогах и подключить их в файле проекта подобным образом:
1 2 3 4 |
include(module1/module1.pri) include(module2/module2.pri) |
Если в каталогах модулей уже есть файлы, их можно добавить в проект через контекстное меню модуля (из основного файла проекта их, естественно, нужно будет убрать).