Время на прочтение6 мин
Количество просмотров100K
Вступление
Добрый день, уважаемые читатели! Совсем недавно я завершил разработку одного своего приложения на Qt, и мне захотелось создать профессиональную программу установки, чтобы всё было «как у взрослых». Как оказалось, сделать это непросто, учитывая, что на официальном сайте инструментария информации по развёртыванию почти нет. В данной статье рассмотрены некоторые этапы подготовки программ на Qt версии 5.2 или выше для распространения на компьютеры других пользователей. Итак, вот план руководства:
- Подготовка проекта Qt к развёртыванию
- Компоновка дистрибутива программы
- Подписание кода и создание установщика
Не будем терять времени и приступим к работе.
1. Подготовка проекта Qt к развёртыванию
Для того, чтобы было проще следовать инструкциям, создадим простой проект Qt Widgets. Все последующие операции будут относиться к этому проекту. Ниже приведено содержимое исходных файлов приложения:
HelloWorld.pro
QT += core gui widgets
TARGET = HelloWorld
TEMPLATE = app
SOURCES += main.cpp
main.cpp
#include <QApplication>
#include <QLabel>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QLabel label("Hello, world!");
label.setAlignment(Qt::AlignCenter);
label.resize(200, 50);
label.show();
return a.exec();
}
Программы выглядят особенно качественно и профессионально, если они несут с собой метаданные о разработчике, версии программного продукта, авторских правах, языке и многом другом. Для примера, обратимся к свойствам файла Photoshop.exe всем известной системы Adobe Photoshop. На рисунке ниже показано окно свойств данного файла:
Добавить подобную информацию можно с помощью файла ресурсов. Файл ресурсов имеет расширение .rc и несёт в себе текстовый код, описывающий используемые в приложении ресурсы. Подобные скрипты используются в проектах Visual Studio, основанных на WinAPI, и содержат различные дескрипторы иконок, строк, идентификаторов и прочего. В проектах Qt всё это имеет мало смысла, однако включение общей информации о программе всё же необходимо. Ниже приведены исходный код файла ресурсов и содержимое файла проекта, который также потребуется изменить:
resources.rc
IDI_ICON1 ICON "icon.ico"
#include <windows.h>
#define VER_FILEVERSION 1,0,0,0
#define VER_FILEVERSION_STR "1.0.0.0\0"
#define VER_PRODUCTVERSION 1,0,0
#define VER_PRODUCTVERSION_STR "1.0.0\0"
#define VER_FILEDESCRIPTION_STR "HelloWorld"
#define VER_INTERNALNAME_STR "Sensor"
#define VER_LEGALCOPYRIGHT_STR "Copyright (C) 2015, MyCompany"
#define VER_ORIGINALFILENAME_STR "HelloWorld.exe"
#define VER_PRODUCTNAME_STR "Hello World"
VS_VERSION_INFO VERSIONINFO
FILEVERSION VER_FILEVERSION
PRODUCTVERSION VER_PRODUCTVERSION
BEGIN
BLOCK "StringFileInfo"
BEGIN
BLOCK "040904E4"
BEGIN
VALUE "FileDescription", VER_FILEDESCRIPTION_STR
VALUE "FileVersion", VER_FILEVERSION_STR
VALUE "InternalName", VER_INTERNALNAME_STR
VALUE "LegalCopyright", VER_LEGALCOPYRIGHT_STR
VALUE "OriginalFilename", VER_ORIGINALFILENAME_STR
VALUE "ProductName", VER_PRODUCTNAME_STR
VALUE "ProductVersion", VER_PRODUCTVERSION_STR
END
END
BLOCK "VarFileInfo"
BEGIN
VALUE "Translation", 0x409, 1252
END
END
HelloWorld.pro
QT += core gui widgets
TARGET = HelloWorld
TEMPLATE = app
SOURCES += main.cpp
RC_FILE = resources.rc
В данном примере важно не забыть добавить файлы resources.rc и icon.ico в папку с исходными файлами проекта. На рисунке ниже показано окно свойств программы после сборки:
Иногда бывает необходимо, чтобы программа запускалась с правами администратора. В рамках Qt это можно реализовать путём использования несложных инструкций в файле проекта. Ниже приведён код, позволяющий программе запрашивать права администратора при запуске:
HelloWorld.pro
QT += core gui widgets
TARGET = HelloWorld
TEMPLATE = app
SOURCES += main.cpp
RC_FILE = resources.rc
win32
{
CONFIG += embed_manifest_exe
QMAKE_LFLAGS_WINDOWS += /MANIFESTUAC:"level='requireAdministrator'"
}
Следует отметить, что все указанные выше инструкции будут гарантированно работать только при использовании комплекта сборки Visual Studio. Подробную информацию о файлах ресурсов можно найти на портале MSDN в разделе «About Resource Files».
2. Компоновка дистрибутива программы
Создание дистрибутива приложения с учётом всех его файлов, которые должны устанавливаться на компьютерах пользователей, вероятно, является самым сложным этапом развёртывания. Требуется тщательно проанализировать исполняемый файл программы на наличие зависимостей, позаботиться о файлах переводов, не забыть про ресурсы приложения. Решить часть этих проблем поможет утилита
windeployqt.exe
, которая поставляется вместе с комплектом сборки. Данный инструмент работает в командной строке и поддерживает некоторые параметры конфигурации. На рисунке ниже показано окно командной строки с запущенной утилитой:
Последним параметром обязательно должен быть указан путь к двоичным файлам собранного приложения или имена этих файлов. В таблице ниже перечислены параметры утилиты, которые можно использовать при работе с ней:
После запуска утилиты возле исполняемого файла программы должны появиться различные библиотеки и служебные файлы, которые позволят приложению корректно запускаться и работать на многих компьютерах. На рисунке ниже показано окно Проводника Windows со структурой дистрибутива:
Следует отметить, что перед использованием windeployqt.exe необходимо добавить путь к этому файлу в переменную среды PATH, в противном случае данный инструмент работать не будет.
3. Подписание кода и создание установщика
После компоновки дистрибутива программы попробуем запустить приложение от имени администратора. На рисунке ниже показано сообщение системной службы User Account Control (UAC) с предупреждением о запуске приложения неизвестного издателя:
Данное предупреждение отпугивает пользователей и создаёт приложению плохую репутацию. Чтобы исправить ситуацию, нужно подписать файлы программы с помощью специального сертификата. Разработчики, подписывая свои программы, как бы дают дополнительные гарантии надёжности приложений с точки зрения информационной безопасности. Разработчики программного обеспечения с открытым исходным кодом могут получить сертификаты для своих проектов бесплатно, к примеру, на сайте Certum. Для использования сертификата понадобиться специальная программа, которая подпишет файлы приложения. Для этого можно использовать удобный инструмент DigiCert Certificate Utility. На рисунке ниже показано окно данной программы со списком сертификатов для подписания кода:
После использования данной утилиты стоить снова попробовать запустить приложение от имени администратора. Ниже показано сообщение UAC с отображением информации об издателе программы:
После проделанной работы пришло время задуматься над выбором системы создания установщика для подготовленного приложения. Существуют как платные, так и бесплатные продукты для выполнения данной задачи. В таблице ниже перечислены некоторые инструменты для создания программ установки:
Сложно дать какие-либо рекомендации по поводу выбора той или иной системы. Разработчики ПО с открытым исходным кодом, вероятно, выберут бесплатные инструменты, в то же время платные продукты часто используются коммерческими компаниями.
Заключение
В заключение нужно сказать, что к подготовке приложений к выпуску следует подходить с большой ответственностью. Перед использованием программы пользователь проходит этап установки продукта на компьютер. Информация, которую он при этом получает, должна произвести благоприятное впечатление.
Публикация приложения
Публикация приложения на десктопных платформах
Последнее обновление: 15.01.2024
При запуске проекта Qt (например, в Qt Creator) фреймворк создает папку с бинарным файлом приложения. Однако создаваемый файл содержит много служебной информации, которая применяется для разработки и отладки,
но простому пользователю не нужна. Кроме того, для полноценной работы приложению нужны дополнительные файлы — различные библиотеки, которые применяются для его работы. В процессе отладки и запуска приложения
в Qt Creator такие файлы автоматически связываются с бинарным файлом. Однако в самой папке сгенерированного бинарного файла эти файлы могут отсутствовать, а бинарный файл при запуске может их не найти.
В связи с этим возникает необходимость создания выходного пакета приложения, которое можно просто скопировать на другой компьютер с определенной операционной системой и одним нажатием
на бинарный файл, запустить его. Рассмотрим, как собрать приложение на Qt в выходной пакет.
Настройка информации приложения
Перед сборкой мы можем добавить для приложения некоторые метаданные о приложении, в частности, имя, версию приложения, сведения о компании. Для этого
в файле main.cpp у класса QApplication (или QGuiApplication в случае с qml)
можно использовать несколько методов
int main(int argc, char *argv[]) { QApplication app(argc, argv); app.setOrganizationName("MyCorp"); // имя компании app.setOrganizationDomain("metanit.com"); // домен компании app.setApplicationName("Test Application"); // имя приложения app.setApplicationVersion("1.0.0"); // версия приложения // остальное содержимое файла
Построение приложения в режиме Release
Для создания релизной версии приложения для проекта надо в качестве режима построения указать Release
Затем нажатию на пункт меню Build можно выбрать один из пунктов контекстного меню для построения проекта (например, на пункт Build Project/Rebuild)
Также для построения можно нажать на значок молоточка в левом нижнем углу Qt Creator.
Через пункт меню Edit -> Preferences можно перейти к окну настроек и далее выбрать пункт Build & Run для конфигурации ряд настроек построения.
В частности, мы можем задать выходной каталог для построения приложения
По умолчанию приложение создается в текущем каталоге проектов в папку, которая называется по шаблону build-{Имя_Проекта}-{инструментарий_построения}-{Имя_конфигурации}")
Например, в моем случае проект называется «QmlApp», инструментарий построения (Kit) — «Desktop_x86_windows_msvc2022_pe_64bit», а конфигурация — «Release», соответственно папка приложения называется build-QmlApp-Desktop_x86_windows_msvc2022_pe_64bit-Release
.
Здесь я могу найти исполняемый файл построенного приложения, который по умолчанию называется по имени проекта:
Однако при попытке запуска подобного файла мы можем столкнуться с ошибкой отстутствия некоторых библиотек:
Мы могли бы вручную попытаться скопировать все необходимые файлы в каталог приложения. Однако фреймворк Qt предоставляет ряд утилит для автоматизации публикации приложения.
Публикация на Windows
Для публикации приложения на Windows Qt предоставляет специальную утилиту windeployqt6, которая находится в папке фреймворка (для старых версий фреймворка — Qt 5 также поставляется
утилита windeployqt.exe — без цифры 6 в названии).
В общем случае ее применение имеет следующий синтаксис:
windeployqt6 [options] [files]
Если публикуется приложение на виджетах Qt, то этой утилите достаточно передать путь к приложению:
windeployqt6 C:\Users\eugen\Documents\QtProjects\build-QmlApp-Desktop_x86_windows_msvc2022_pe_64bit-Release\QmlApp.exe
Но если публикуется приложение, которое использует QML/Qt Quick, то этой утилите передается аргумент --qmldir
, путь к папке qml-файлов и путь к файлу приложения:
windeployqt6 --qmldir путь_к_файлам_qml путь_к_приложению
Например, в моем случае папка проекта, где размещены файлы qml — «C:\Users\eugen\Documents\QtProjects\QmlApp», а путь к построенному приложению —
«C:\Users\eugen\Documents\QtProjects\build-QmlApp-Desktop_x86_windows_msvc2022_pe_64bit-Release\QmlApp.exe», поэтому в моем случае команда на публикаю выглядит так:
windeployqt6 --qmldir C:\Users\eugen\Documents\QtProjects\QmlApp C:\Users\eugen\Documents\QtProjects\build-QmlApp-Desktop_x86_windows_msvc2022_pe_64bit-Release\QmlApp.exe
В результате windeployqt6 скопирует все необходимые файлы в папку приложения. В дальнейшем мы сможем переносить папку приложения с компьютера на компьютер с той же ОC и запускать приложение.
Минусом такого подхода является то, что большой размер папки даже для примитивного приложеия и что при этом создается и компируется много каталогов и файлов, которые в реальности не нужны для работы приложения.
Публикация на Linux
Qt не предоставляет для дистрибутивов Linux готовых инструментов, аналогичных windeployqt. Возможно, это связано с большим количеством разновидностей Linux.
Но есть аналогичный неофициальный инструмент с открытым исходным кодом под названием linuxdeployqt. Он также принимает скомпилированный файл приложения
в качестве параметра и превращает его в автономный пакет путем репликации ресурсов проекта в пакет. Пользователи могут получить сгенерированный пакет. linuxdeployqt
может упаковывать определенные библиотеки и компоненты, необходимые для запуска приложения на основе Qt. Загрузить инструмент можно по ссылке
https://github.com/probonopd/linuxdeployqt/releases
Публикация для macOS
Для публикации приложения для MacOS Qt предоставляет инструмент macdeployqt, который аналогичен windeployqt и который можно найти в папке Qt в каталоге «bin».
Так, этой утилите передается путь к приложению. Для приложения Qt Quick также передается параметр -qmldir
с путем к файлам QML:
macdeployqt /Users/foo/myapp-build/MyApp.app -qmldir=/Users/foo/myapp/qml -dmg
Статическая сборка проекта Qt под Windows.
Отвязка проекта, сделанного в Qt, от .dll зависимости.
При создании проекта релиза, программа не будет запускаться на другом компьютере без дополнительных библиотек. Это не очень удобно, потому как при потере даже одной, ваш знакомый не увидит ваше творчество. К тому же, они придают программе дополнительный размер. И это тоже минус.
Что же делать?
Смотрим данное видео.
Пошаговая настройка статической сборки Qt для Windows:
1. Скачиваем Qt c http://www.qt.io/download-open-source/#section-2 (Открывается в новом окне)
2. Устанавливаем Qt. При установке нажимаем кнопку «Выбрать все»
3. Переходим в папку C:\Qt\Qt5.5.0\5.5\Src\qtbase\mkspecs\win32-g++\ (Подчеркнутое — Изменить под свою версию)
4. Редактируем qmake.conf
Находим
QMAKE_LFLAGS =
Меняем на
QMAKE_LFLAGS = -static
5. Переходим в папку Qt\Qt5.5.0\5.5\Src\qtbase\ (Подчеркнутое — Изменить под свою версию)
6. Прямо в папке qtbase создаем батник Install.bat с кодом, который написан внизу или копируем уже готовый.
Код батника (Install.bat):
@echo off set PATH=c:\Qt\Qt5.5.0\5.5\mingw492_32\bin;c:\Qt\Qt5.5.0\Tools\mingw492_32\bin;%PATH% echo exec configure title Configure configure.exe -debug-and-release -opensource -c++11 -static -opengl desktop -no-angle -nomake examples -platform win32-g++ echo exec maker title MiniGW32 mingw32-make sub-src title The End pause
Внимание! на строчку
set PATH=c:\Qt\Qt5.5.0\5.5\mingw492_32\bin;c:\Qt\Qt5.5.0\Tools\mingw492_32\bin;%PATH% Измените Qt5.5.0\5.5 на свою версию.
8. Запускаем батник, соглашаемся с лицензией, нажимаем «y» и ожидаем окончании работы.
По окончании выполнения батника, делаем следующее:
9. Запускаем Qt Creator.
10. Переходим «Инструменты» -> «Параметры» -> «Сборка и запуск» -> «Qt Versions» и нажимаем «Добавить»
11. Добавляем путь C:\Qt\Qt5.5.0\5.5\Src\qtbase\bin\qmake.exe (Подчеркнутое — Изменить под свою версию)
12. Для большей удобности в «Название профиля» дописываем Static. Жмем кнопку «Применить».
13. Переходим в «Комплекты» и нажимаем «Добавить»
14. Меняем «Название» на Static.
15. В «Профиль Qt:» меняем на новый профиль «Qt 5.5.0 (Src) Static». Жмем кнопку «ОК» или «Применить».
Все готово. Теперь проверяем на простой программе и приступаем к программированию.
Готовый батник (Install.bat):
Скачать
В данном HOWTO мы подробно рассмотрим как собирать статически слинкованные приложения (не требующие библиотек Qt для запуска и работы), написанные на Qt, для Windows прямо из GNU/Linux при помощи компилятора MinGW.
Введение
Для быстрой конфигурации сборки и настройки проектов мы будем использовать свободную IDE Qt Creator, поэтому установим её:
sudo yum -y install qt-creator
Установка компонентов
Для сборки нам потребуется Qt и его заголовочные файлы:
sudo yum -y install qt-devel
MinGW32:
sudo yum -y install mingw32
Qt для MinGW32 и его статически слинкованная версия под платформу Win32:
sudo yum -y install mingw32-qt-*
В случае необходимости, установите и WebKit:
sudo yum -y install mingw32-webkitgtk-static
Настройка среды
1. Запустите Qt Creator, откройте настройки среды через меню Tools — Options и переключите его интерфейс на английский язык.
2. Перейдите на страницу Build & Run, на вкладку Qt Versions.
3. Нажмите кнопку Add… и укажите путь к установленному Qt Static. Обычно путь следующий:
/usr/i686-w64-mingw32/bin/qmake-qt4
4. Заполните поле Version name, указав там текущую версию Qt с постфиксом Static. Нажмите Apply.
5. В том же окне настроек перейдите на вкладку Compilers. Нажмите кнопку Add -> MinGW и укажите название (в поле Name рекомендуем указать MinGW32) и путь к компилятору MinGW в Compiler path. В большинстве случаев он будет следующим:
/usr/bin/i686-w64-mingw32-g++
Не забудьте нажать Apply после завершения ввода пути.
6. Перейдите на вкладку Kits, нажмите кнопку Add и укажите следующие параметры:
- Name — MinGW32;
- Compiler — MinGW32;
- Debugger — System GDB;
- Qt version — ваше название с постфиксом Static.
Не забудьте нажать Apply и теперь OK для закрытия формы и применения созданных конфигураций.
7. Откройте свой проект в Qt Creator, выберите на левой панели пункт Projects. Нажмите кнопку Add Kit и выберите созданный нами MinGW32.
8. Переключитесь на конфигурацию MinGW32, затем в меню Edit build configuration выберите Release. Теперь около Build Steps нажмите кнопку Details и в поле Additional arguments впишите следующее:
CONFIG+=static CONFIG+=staticlib
Сборка проекта
В меню Build IDE Qt Creator выберите пункт Build project. Если вы всё настроили верно, сборка завершится без ошибок и вы получите статически слинкованный exe файл для ОС Microsoft Windows.
Статическая сборка на основе Qt 5.15.1 MinGWx64 в Windows 10
1. Запускаем qt-unified-windows-x86-4.2.0-online.exe
- Cкачать с сайта Qt
Qt устанавливать нужно на диск C
2. Запускаем установшики Python, Perl, Ruby (64 битные версии)
Cкачать последнюю версию с сайтов производителей:
- Python x64
- Perl x64
- Ruby x64 (WITHOUT DEVKIT)
Дальше нужно установить(Устанавливать нужно на диск C):
- Python
- Perl
- Ruby
3. Добавляем пути к программам и библиотекам в параметры системы:
Поиск:arrow_right:Система:arrow_right:Дополнительные параметры системы:arrow_right:Параметры среды:arrow_right:Системные переменные:arrow_right:Path:arrow_right:Изменить
- Создаём пути
4. Далее скачиваем исходник QT 5.15.1
- Cкачать с сайта Qt
Разархивируйте его в папку Qt, для удобства создайте папку Src и разархивируйте туда
- Должно получиться вот так, после разахивирования
C:\Qt\Src\qt-everywhere-src-5.15.1\
5. Запускаем cmd и переходим в папку
C:\Qt\Src\qt-everywhere-src-5.15.1\
- Команды для командной строки:
C:\Users\Cereg>cd..
C:\Users>cd..
C:\>cd Qt
C:\Qt>cd Src
C:\Qt\Src>cd qt-everywhere-src-5.15.1
C:\Qt\Src\qt-everywhere-src-5.15.1>
- В Командную строку вставляем это команду:
configure -static -debug-and-release -platform win32-g++ -qt-zlib -qt-pcre -qt-libpng -qt-libjpeg -qt-freetype -opengl desktop -no-angle -no-openssl -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests -prefix C:\Qt\5.15.1\mingw81_64_static
- После завершения проверки вставляем это команду:
mingw32-make -k -j16
(16 это количество ядер на компьютере)
- После завершения вставляем это команду:
mingw32-make -k install
ВЫПОЛНЕНИЕ МОЖЕТ ПРОХОДИТЬ ОЧЕНЬ ДОЛГО (4-6 ЧАСОВ), ВСЕ ЗАВИСИТ ОН МОЩНОСТЬИ ВАЩЕГО КОМПЬЮТЕРА , И ОТ КОЛИЧЕСТВА БИБЛИОТЕК КОТОРЫЕ ВАМ НУЖНЫ
6. После завершения процедуры переходим в Qt Creator и запускаем какой-то проект
- Переходим в:
Проекты:arrow_right:Управление:arrow_right:Профили Qt:arrow_right:Добавить
- Добавляем qmake.exe и для удобства называем
Qt (5.15.1) static
ЕСЛИ НЕ ХВАТАЕТ КАКОЙ-ТО БИБЛИОТЕКИ ИЛИ ФАЙЛА (ЭТО БУДЕТ НАПИСАНО ПОД qmake path), ТО ПЕРЕХОДИМ В
C:\Qt\5.15.1\mingw81_64\bin
И КОПИРУЕМ НЕОБХОДИМЫЕ ФАЙЛЫ(ФАЙЛЫ С ОДИНАКОВЫМ НАЗВАНИЕМ) В
C:\Qt\5.15.1\mingw81_64_static\bin
(БЕЗ ЗАМЕНЫ)
- Переходим в:
Проекты:arrow_right:Управление:arrow_right:Комплекты:arrow_right:Добавить
- Добавляем новую сборку
- Переходим в Проекты, и добавляем сборку в проект, нажать на зеленый плюсик
- Переходим в .pro файл и добавляем строку
QMAKE_LFLAGS_RELEASE += -static -static-libgcc
- И собираем проект для релиза
ЕСЛИ ВЫЛЕТАЮТ ОШИБКИ: cannot found -ltiff, cannot found -lwebp
Можно взять библиотеку tiff из этого репозитория или скачать
Можно взять библиотеку webp из этого репозитория или скачать
- Нужно в папку
C:\Qt\Tools\
добавить библиотеки - Разархивируйте их в папку
C:\Qt\Tools\
и переменуйте папки вlift
иlibwebp
- И добавляем пути в систему, как в пункте 3
- Повторяем 5 пукнт и добавляем в команду
-qt-tiff -qt-webp
, полная команду будет выглядить так:
configure -static -debug-and-release -platform win32-g++ -qt-zlib -qt-pcre -qt-libpng -qt-tiff -qt-webp -qt-libjpeg -qt-freetype -opengl desktop -no-angle -no-openssl -opensource -confirm-license -make libs -nomake tools -nomake examples -nomake tests -prefix C:\Qt\5.15.1\mingw81_64_static
- И заново создаем сборщик, как в пункте 5