Вступление
Добрый день, уважаемые читатели! Совсем недавно я завершил разработку одного своего приложения на 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, которая поставляется вместе с комплектом сборки. Данный инструмент работает в командной строке и поддерживает некоторые параметры конфигурации. На рисунке ниже показано окно командной строки с запущенной утилитой:
Последним параметром обязательно должен быть указан путь к двоичным файлам собранного приложения или имена этих файлов. В таблице ниже перечислены параметры утилиты, которые можно использовать при работе с ней:
Параметр | Описание |
-?, -h, --help | Вывод справки |
-v, --version | Вывод информации о версии |
--dir <каталог> | Использовать указанный каталог вместо каталога файлов |
--libdir <путь> | Каталог, в который будут скопированы библиотеки |
--debug | Использовать отладочные версии файлов |
--release | Использовать файлы для выпуска |
--release-with-debug-info | Использовать файлы для выпуска с отладочной информацией |
--force | Заменить уже существующие файлы |
--dry-run | Провести работу с целью проверки |
--no-plugins | Пропустить копирование плагинов |
--no-libraries | Пропустить копирование библиотек |
--qmldir <каталог> | Сканировать импорт QML, начиная с указанного каталога |
--no-quick-import | Пропустить Qt Quick |
--no-translations | Пропустить копирование файлов перевода |
--no-system-d3d-compiler | Пропустить копирование компилятора Direct3D |
--compiler-runtime | Копировать зависимости компилятора |
--no-compiler-runtime | Пропустить зависимости компилятора |
--webkit2 | Копировать файлы WebKit2 |
--no-webkit2 | Пропустить WebKit2 |
--json | Печатать вывод в формате JSON |
--angle | Копировать файлы ANGLE |
--no-angle | Пропустить ANGLE |
--list <режим> | Печатать только имена копируемых файлов. Режимы: source, target, relative, mapping |
--verbose <уровень> | Уровень отладки |
-<имя библиотеки> | Добавить указанную библиотеку |
--no-<имя библиотеки> | Не добавлять указанную библиотеку |
После запуска утилиты возле исполняемого файла программы должны появиться различные библиотеки и служебные файлы, которые позволят приложению корректно запускаться и работать на многих компьютерах. На рисунке ниже показано окно Проводника Windows со структурой дистрибутива:
Следует отметить, что перед использованием windeployqt.exe необходимо добавить путь к этому файлу в переменную среды PATH, в противном случае данный инструмент работать не будет.
3. Подписание кода и создание установщика
После компоновки дистрибутива программы попробуем запустить приложение от имени администратора. На рисунке ниже показано сообщение системной службы User Account Control (UAC) с предупреждением о запуске приложения неизвестного издателя:
Данное предупреждение отпугивает пользователей и создаёт приложению плохую репутацию. Чтобы исправить ситуацию, нужно подписать файлы программы с помощью специального сертификата. Разработчики, подписывая свои программы, как бы дают дополнительные гарантии надёжности приложений с точки зрения информационной безопасности. Разработчики программного обеспечения с открытым исходным кодом могут получить сертификаты для своих проектов бесплатно, к примеру, на сайте Certum. Для использования сертификата понадобиться специальная программа, которая подпишет файлы приложения. Для этого можно использовать удобный инструмент DigiCert Certificate Utility. На рисунке ниже показано окно данной программы со списком сертификатов для подписания кода:
После использования данной утилиты стоить снова попробовать запустить приложение от имени администратора. Ниже показано сообщение UAC с отображением информации об издателе программы:
После проделанной работы пришло время задуматься над выбором системы создания установщика для подготовленного приложения. Существуют как платные, так и бесплатные продукты для выполнения данной задачи. В таблице ниже перечислены некоторые инструменты для создания программ установки:
Платные | Бесплатные |
InstallShield | Qt Installer Framework |
Setup Factory | NSIS |
SetupBuilder | Inno Setup |
Smart Install Maker | WiX |
Сложно дать какие-либо рекомендации по поводу выбора той или иной системы. Разработчики ПО с открытым исходным кодом, вероятно, выберут бесплатные инструменты, в то же время платные продукты часто используются коммерческими компаниями.
Заключение
В заключение нужно сказать, что к подготовке приложений к выпуску следует подходить с большой ответственностью. Перед использованием программы пользователь проходит этап установки продукта на компьютер. Информация, которую он при этом получает, должна произвести благоприятное впечатление.