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


    Вступление


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

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

    Заключение


    В заключение нужно сказать, что к подготовке приложений к выпуску следует подходить с большой ответственностью. Перед использованием программы пользователь проходит этап установки продукта на компьютер. Информация, которую он при этом получает, должна произвести благоприятное впечатление.
    Поделиться публикацией
    Комментарии 11
    • НЛО прилетело и опубликовало эту надпись здесь
        +2
        Спасибо за замечание, добавил в список. Надо будет попробовать этот фреймворк в действии, ни разу его не использовал.
        +3
        А еще можно собрать статический тулкит Qt и собирать все в один исполняемый файл, который потом сжать UPX'ом.
          +11
          Это если лицензия позволяет.
          +3
          Хорошая статья. Я просто копирую скриптом нужные приложению бинарники Qt самостоятельно. О windeployqt не подумал, хотя на маке использую macdeployqt (там без поллитра не разберёшься, а на винде .dll скопировал — и готово). Надо попробовать. А то бывали накладки, когда подключал новый модуль Qt, а .dll в скрипт дописывать забывал.

          В качестве инсталлятора очень рекомендую Inno Setup.
            0
            Написал давно скрипт для InnoSetup и забыл про все проблемы. Увидел статью вспомнил. что есть другие средства для создания инсталляторов… Спасибо!
            –1
            Плюс. (и к карме) :)
              +3
              QMAKE_TARGET_COMPANY
              QMAKE_TARGET_PRODUCT
              QMAKE_TARGET_COPYRIGHT
              RC_ICONS
              VERSION

              Если эти переменные заданы, то qmake сгенерит сам rc файл и запишет в него их содержимое.

              windeployqt работает только для простых приложений. Если есть использование Qt Multimedia, SVG формата, различных контролов из Qt Quick, поддержка печати и вебкамеры, то собирать бинарники придется все равно самому.
                0
                Почему? Я не использую SVG, но он всё равно подложил мне QtSvg.dll и все плагины imageformats.
                  0
                  Iconengines еще нужно. Я тоже не знаю почему. Дважды пытался использовать эту утилиту, сталкивался с проблемами описанными выше. Да, она что-то копирует, но не полностью.
                    0
                    Она мне скопировала папку iconengines с единственным файлом qsvgicon.dll. Qt 5.4.2
                    .

              Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

              Самое читаемое