Политика конфиденциальностиКонтактыО сайтеОтзывыGitHubDonate
© EVILEG 2015-2018
Рекомендует хостинг
TIMEWEB

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

sources, headers, qt, config, libs, qt5, 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

Комментарии

31 января 2018 г. 5:56

В главе

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

31 января 2018 г. 8:51

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

Для Django рекомендую VDS-хостинг TIMEWEB

3 сентября 2018 г. 13:07

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

5 сентября 2018 г. 7:59

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

В данном случае нужно перезапустить qmake и лучше сделать чистую сборку

Для Django рекомендую VDS-хостинг TIMEWEB

14 сентября 2018 г. 9: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 он сам еще и сеть подключает, даже и не знаю

15 сентября 2018 г. 10:29

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

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

Для Django рекомендую VDS-хостинг TIMEWEB

Комментарии

Только авторизованные пользователи могут оставлять комментарии.
Пожалуйста, Авторизуйтесь или Зарегистрируйтесь
18 ноября 2018 г. 19:19
cyrillwork

Qt - Тест 001. Сигналы и слоты

  • Результат:78баллов,
  • Очки рейтинга2
16 ноября 2018 г. 19:09
Илья Завьялов

Qt - Тест 001. Сигналы и слоты

  • Результат:31баллов,
  • Очки рейтинга-10
16 ноября 2018 г. 12:49
Ирина Минигузина

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

  • Результат:0баллов,
  • Очки рейтинга-10
Последние комментарии
16 ноября 2018 г. 6:50
Евгений Легоцкой

Добрый день! шаблон не находит, или шаблон неправильно прописали, или тег шаблона неправильно написан, иных выводов сделать не могу, из того, что вы написали. трейсбек нужно смотреть. Со...
16 ноября 2018 г. 6:48
Евгений Легоцкой

пройтись циклом по всем виджетам в обратном порядке for (int i = ui->vertialLayout->count() - 1; i >= 0; --i){ QWidget* w = ui->verticalLyout->itemAt(i)->widget();...
15 ноября 2018 г. 21:35
chunk

Доброго времени суток Евгений. Не подскажете что я делаю не так? Получаю ошибку такого характера: Reverse for 'add_comment' with arguments '('',)' not found. 1 pattern(s) tried: ...
15 ноября 2018 г. 15:35
Михаиллл

Спасибо. Похоже где то описку сделал, поэтому не работало. Я добавил на verticalLayout много виджитов. А можно ли их как то быстро и просто удалить?
15 ноября 2018 г. 14:55
Евгений Легоцкой

verticalLayout - это, по-моему предположению, должен быть у вас объект класса QVBoxLayout, который наследован от QBoxLayout. Поэтому открываете документацию на QVBoxLayout ...
Сейчас обсуждают на форуме
18 ноября 2018 г. 18:11
Metelev

Большое спасибо, все получилось, завтра начну изучать код.
18 ноября 2018 г. 17:49
Чарльз Грин

Спасибо, буду разбераться
17 ноября 2018 г. 14:13
Чарльз Грин

Я сейчас занимаюсь мультимедией, это аудио и видео, программы для концертов и т. д. Бибилиотека Qt очень помогает, она надежная, а надежность в моих приложениях очень важный фактор чтоб не пол...
16 ноября 2018 г. 16:28
Евгений Легоцкой

Добрый день! Спасибо, что воспользовались именно форумом. Заниматься курсовыми работами чьими-то ни было у меня времени нет, у самого полторы работы. Но что-то подсказать на фо...
Присоединяйтесь к нам в социальных сетях

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы