Evgenii Legotckoi
Evgenii Legotckoi16 октября 2015 г. 12:25

Qt/C++ - Урок 025. Создание проекта файлов для сборки утилитой qmake

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

Элементы проектного файла

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

Переменные

В проектном файле, переменные используются для хранения списка строк. В простейшем проекте, эти переменные информируют qmake о настройке параметров для использования, или поставляют имена файлов и используемых путей в процессе сборки.

qmake ищет эти переменные в каждом проектном файле, и используется содержимой для определения того, что должно быть записано в Makefile. Например, список значений в переменных HEADERS и SOURCES используются для уведомления qmake об исходных и заголовочных файлах в некоторых директориях.

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

Присваивание списка значений переменной:

HEADERS = mainwindow.h paintwidget.h

Список значений переменных расширяется следующим образом:

SOURCES = main.cpp mainwindow.cpp \
          paintwidget.cpp
CONFIG += console

Примечание: Первое задание значений включает только те значения, которые указаны в одной строке с переменной HEADERS. Второе объявление разделяет значения как в переменной SOURCES через обратный слеш ("\").

Переменная CONFIG является другой специальной переменной, которая используется qmake, когда генерируется Makefile.


Список переменных

Далее представлен список наиболее часто используемых переменных и описание их содержания.

  • CONFIG - Основные параметры настройки проекта
  • DESTDIR - Директория, в которую будет помещён бинарник или исполняемый файл
  • FORMS - Список UI файлов, которые реализуют пользовательский интерфейс
  • HEADERS - Список имён заголовочных файлов (.h) и путей к ним
  • QT - Список модулей Qt, используемых в проекте
  • RESOURCES - список ресурсный файлов (.qrc), включаемых в финальный проект.
  • SOURCES - список файлов исходных кодов, которые используются при сборке проекта.
  • TEMPLATE - шаблон, используемый в проекте. Определяет то, чем будет проект после компиляции, приложением, библиотекой или плагином.

Содержимое переменных может быть присвоено другим переменным с помощью подстановки двух знаков  $ перед именем других переменных.

Пробелы

Обычно, пробелы разделяют значения в переменных. Для указания переменной, содержащей в своём имени пробел, вы должны заключить переменную в скобки:

DEST = "Program Files"

Текст, заключённый в скобки, считается одним предметом в списке переменных. Подобный подход также применяется и в других случаях. Например при указаний путей к файлам, содержащим пробелы:

win32:INCLUDEPATH += "C:/mylibs/extra headers"
unix:INCLUDEPATH += "/home/user/extra headers"

Комментарии

Вы обычно добавляется комментарии в проект файлов. Коментарии начинаются со знака # и продолжаются до конца одной строки.

# Comments usually start at the beginning of a line, but they
# can also follow other content on the same line.

Встроенные функции и управление потоком

qmake предоставляет несколько встроенных функций для включения содержания переменных. Обычно используемой функцией в простых проектах является функция include(), которая принимает имя файла в качестве аргумента. Содержание файла включается в проект в том месте, где была использована функция include. Функция include обычно используется для подключения других проектов файлов.

include(other.pro)

Поддержка условных структур делает доступным области, которые ведут себя, как если бы они были объявления в языке программирования:

win32 {
    SOURCES += paintwidget_win.cpp
}

Назначение внутри скобок будет выполнено если является верным. В этом случае, win32 должна быть установлена в параметре CONFIG . Это происходит автоматически в Windows. Открывающаяся скобка должна стоять на одной строке с условием.

Более сложные операции над переменными обычно требуют циклов, которые предоставляются встроенными функциями, такими как find(), unique(), count(). Эти функции, и многие другие предоставляют управление строками и путями с поддержкой ввода и вызова внешних инструментов.

Шаблоны проекта

Переменная TEMPLATE используется для объявления типа проекта, который будет собран. Если он не декларирован в проектном файле, то qmake соберёт проект как приложение и генерирует Makefile или эквивалентный.

Далее представлены типы проектов, доступные для генерации qmake и их описания.

  • app (по умолчанию) - Makefile собирается в приложение
  • lib - Makefile собирается в библиотеку
  • aux - Makefile ни во что не собирается. Используется если не требуется компилятор, но требуется создать цель, например, если проект написан на интерпретируемом языке.
  • subdirs - Makefile содержит правила для поддиректорий указанных с использованием переменной SUBDIRS. Каждая поддиректория должна содержать свой собственный файл проекта.
  • vcapp - Visual Studio Project file для сборки в приложение
  • vclib - Visual Srudio Project file для сборки в библиотеку
  • vcsubdirs - Visual Studio Project file для сборки проекта в поддиректориях

Когда используются поддиректории, то qmake генерирует Makefile для каждой поддиректории, выполняются все проектные файлы, которые находятся и запускается утилита make на вновь созданном Makefile. Переменная SUBDIRS используется для содержания списка всех поддиректорий, с которыми будет произведена работа.

Основная конфигурация

Переменная CONFIG указывает параметры и функции, которые должны быть выполнены в проекте.

Проект может быть собран в режиме отладки и выпуска, или в обоих. Если отладка и выпуску указаны одновременно, то в силу вступает последний. Если указано debug_and_release, собираются обе версии проекта. Makefile, который генерируется qmake включает правило, которое собирает обе версии. Это может быть выполнено следующим образом.

make all

Добавление **build_all**в переменную **CONFIG** создаёт правило по умолчанию, когда собирается проект.

Примечание. Переменная CONFIG также может иметь условия сборки, если используются или не используются определённые параметры для сборки проекта.

CONFIG(opengl) {
    message(Building with OpenGL support.)
} else {
    message(OpenGL support is not available.)
}

В данном случае включаются различные конфигурации для сборок отладки и выпуска.

Примечание. Некоторые из этих параметров получают эффект только в случае соответствия платформе сборки.

  • qt - Проект является Qt приложением и должно быть слинковано с библиотекой Qt. Вы должны использовать переменную QT для контроля добавления Qt модулей, которые требуются для сборки вашего приложения. Это значение добавляется по умолчанию, но Вы можете удалить его, используя qmake для не Qt-проекта.
  • x11 - проект является x11 приложением или библиотекой. Это значение не требуется, если целью является Qt.

Шаблоны приложения и библиотеки предоставляют Вам более специализированные настройки параметров процесса сборки. Например, если Ваше приложение используется Qt библиотеку и Вы хотите собрать в режиме debug, то Ваш проект должен содержать следующую строку:

CONFIG += qt debug

Примечание. Вы должны использовать "+=", а не "=", или qmake не добавит использование настроек Qt.

Объявление Qt библиотек

Если переменная CONFIG содержит значение qt, то для qmake включена поддержка Qt приложений. Это делает возможным определять, какие модули Qt будут использоваться в приложении. Преимущество этого в том, что в переменная QT может быть использована для объявления только необходимых библиотек и модулей. Например мы можем включить модули XML и network следующим образом:

QT += network xml

Примечание. QT включает модули core и gui по умолчанию, также как и модули XML и network. Следующий тип присвоения модулей переменной не включает core и gui и приведёт к ошибкам при компиляции.

QT = network xml # This will omit the core and gui modules.

Если вы хотите собрать проект без модуля gui, то Вам нужно исключить его следующим оператором "-=".

QT -= gui # Only the core module is used.

Особенности настройки

qmake может быть установлен в расширенные функции настройки, которые будут указаны в файлах .prf. Эти расширенные функции часто предоставляют поддержку кастомных инструментов в процессе сборки. Для добавления функций для процесса сборки добавьте имя функции в переменную CONFIG.

Например, qmake, может быть настроена на сборку со внешними библиотеками, которые поддерживают pkg-config, такие как D-Bus и ogg библиотеки.

CONFIG += link_pkgconfig
PKGCONFIG += ogg dbus-1

Объявление других библиотек

Если используются другие библиотеки в вашем проекте в дополнение к модулям Qt, то Вам нужно указать их в проектном файле.

Пути, по которым qmake ищет библиотеки указываются в переменной LIBS. Вы можете указывать путь к библиотеке, используя Unix-style.

LIBS += -L/usr/local/lib -lmath

Пути, содержащие заголовочные файлы, также могут быть указаны подобным образом с помощью переменной INCLUDEPATH

INCLUDEPATH = c:/msdev/include d:/stl/include
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

alex_lip
  • 31 января 2018 г. 0:56

В главе

Объявление Qt библиотек - "Это желает возможным определять" - видимо опечатка -  "делает"

Evgenii Legotckoi
  • 31 января 2018 г. 3:51

Да, спасибо. Опечатка, вернее невнимательно работал с переводом.

d
  • 3 сентября 2018 г. 9:07

а можно как-то исключить xml и network? потому как QT -= network не помогает и сборка все-равно идет с модулем network

Evgenii Legotckoi
  • 5 сентября 2018 г. 3:59

Вы перезапускали qmake после добавленияQT -=xml network?

В данном случае нужно перезапустить qmake и лучше сделать чистую сборку
d
  • 14 сентября 2018 г. 5:48

добавляю QT -= xml network в файл проекта .pro

# make clean

# rm .qmake.stash Makefile

# qmake

# make



И все-равно в параметрах arm-linux-gnueabihf-g++ имеет место быть  -lQt5Quick -lQt5Gui -lQt5Qml -lQt5SerialPort -lQt5Core -lGLESv2 -lpthread


В 5.9 такого не было, возможно в 5.11 при использовании Serialport он сам еще и сеть подключает, даже и не знаю

Evgenii Legotckoi
  • 15 сентября 2018 г. 6:29

Как вариант, для SerialPort может использоваться внутренняя петля, loopback. Может поэтому и тянет с собой эти зависимости. Но это можно проверить, если запустить без этих библиотек собранный проект.

Есть ещё такая мысль, что это может быть багом. У нас на работе когда билд собирается, тоже тянет библиотеки, которые по идее не должны там присутствовать, например, тот же самый Qml, поскольку мы его не используем. Но если учесть, что сам софт занимает пару гигабайт, то пара лишних библиотек на пару десятков мегабайт уже никого не волнует.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
e
  • ehot
  • 31 марта 2024 г. 21:29

C++ - Тест 003. Условия и циклы

  • Результат:78баллов,
  • Очки рейтинга2
B

C++ - Тест 002. Константы

  • Результат:16баллов,
  • Очки рейтинга-10
B

C++ - Тест 001. Первая программа и типы данных

  • Результат:46баллов,
  • Очки рейтинга-6
Последние комментарии
k
kmssr9 февраля 2024 г. 2:43
Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
АК
Анатолий Кононенко5 февраля 2024 г. 9:50
Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
EVA
EVA25 декабря 2023 г. 18:30
Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
J
JonnyJo25 декабря 2023 г. 16:38
Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
G
Gvozdik19 декабря 2023 г. 5:01
Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
Сейчас обсуждают на форуме
a
a_vlasov14 апреля 2024 г. 13:41
Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
Павел Дорофеев
Павел Дорофеев14 апреля 2024 г. 9:35
QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
f
fastrex4 апреля 2024 г. 11:47
Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
P
Pisych27 февраля 2023 г. 12:04
Как получить в массив значения из связанной модели? Спасибо, разобрался:))
AC
Alexandru Codreanu19 января 2024 г. 19:57
QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

Следите за нами в социальных сетях