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, поскольку мы его не используем. Но если учесть, что сам софт занимает пару гигабайт, то пара лишних библиотек на пару десятков мегабайт уже никого не волнует.

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
AD

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:50баллов,
  • Очки рейтинга-4
m
  • molni99
  • 26 октября 2024 г. 11:37

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:80баллов,
  • Очки рейтинга4
m
  • molni99
  • 26 октября 2024 г. 11:29

C++ - Тест 004. Указатели, Массивы и Циклы

  • Результат:20баллов,
  • Очки рейтинга-10
Последние комментарии
ИМ
Игорь Максимов22 ноября 2024 г. 22:51
Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
Evgenii Legotckoi
Evgenii Legotckoi1 ноября 2024 г. 0:37
Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
A
ALO1ZE19 октября 2024 г. 18:19
Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
ИМ
Игорь Максимов5 октября 2024 г. 17:51
Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
d
dblas55 июля 2024 г. 21:02
QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
Сейчас обсуждают на форуме
Evgenii Legotckoi
Evgenii Legotckoi25 июня 2024 г. 1:11
добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
t
tonypeachey115 ноября 2024 г. 17:04
google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
NSProject
NSProject4 июня 2022 г. 13:49
Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
9
9Anonim25 октября 2024 г. 19:10
Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

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