Pull to refresh

Развёртывание приложений Qt в Windows

Reading time 6 min
Views 94K

Вступление


Добрый день, уважаемые читатели! Совсем недавно я завершил разработку одного своего приложения на Qt, и мне захотелось создать профессиональную программу установки, чтобы всё было «как у взрослых». Как оказалось, сделать это непросто, учитывая, что на официальном сайте инструментария информации по развёртыванию почти нет. В данной статье рассмотрены некоторые этапы подготовки программ на Qt версии 5.2 или выше для распространения на компьютеры других пользователей. Итак, вот план руководства:

  1. Подготовка проекта Qt к развёртыванию
  2. Компоновка дистрибутива программы
  3. Подписание кода и создание установщика

Не будем терять времени и приступим к работе.

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

Сложно дать какие-либо рекомендации по поводу выбора той или иной системы. Разработчики ПО с открытым исходным кодом, вероятно, выберут бесплатные инструменты, в то же время платные продукты часто используются коммерческими компаниями.

Заключение


В заключение нужно сказать, что к подготовке приложений к выпуску следует подходить с большой ответственностью. Перед использованием программы пользователь проходит этап установки продукта на компьютер. Информация, которую он при этом получает, должна произвести благоприятное впечатление.
Tags:
Hubs:
+29
Comments 11
Comments Comments 11

Articles