БлогNot. Qt: как запускать виджет без запроса библиотек dll

Qt: как запускать виджет без запроса библиотек dll

В последних сборках Qt появилось встроенное решение и уже не нужно искать сторонних.

Полноценной статической линковки с "упаковкой" библиотек "внутрь" exe'шки вы не получите, но сможете собрать все ресурсы приложения в одной папке, которую можно затем, например, упаковать в саморазворачивающийся или обычный архив и распространять как отдельное приложение.

Предполагаем, что у нас Qt Creator под Windows, хотя в целом подход годится и для других операционок. Вот алгоритм действий, проверенный мной для небольшого виджета с графическим интерфейсом.

Делаем работающую программу в конфигурации по умолчанию (debug). Заметим, что многие предупреждения, с которыми виджет нормально работает в дебаге (вроде неинициализированных переменных) в релизе приводят к тому, что программа отказывается запускаться, так что пишите код аккуратно и старайтесь избавиться не только от ошибок, но и от предупреждений компилятора.

Выбираем в левой панели Qt Creator над кнопкой запуска конфигурацию "Выпуск" (Release), пересобираем проект.

Идём в папку, где сохранен релиз проекта (в Qt Creator можно нажать правой кнопкой мыши на файле проекта и выбрать "Показать в проводнике").

Уровнем выше находим папку с именем вида build-ИмяВиджета-Desktop_Qt_5_14_2_MinGW_64_bit-Release и внутри ещё папку release.

Исполняемый файл с расширением .exe, например, mywidget.exe, копируем в отдельную папку, например, d:\widget

Идём в папку с основными исполняемыми файлами Qt, например, c:\Qt\5.14.2\mingw73_64\bin

Копируем файл windeployqt.exe в папку widget, куда скопировали релиз проекта.

Убеждаемся, что путь к папке bin вашего Qt (такой, как написан выше) добавлен в переменные среды, если нет - добавляем.

Чтобы проверить это, идём Панель управления, Система, Переменные среды, можно просто кликнуть по "Пуск" и набрать соответствующий запрос.

Добавить нужно в системную переменную Path.

Открываем консоль (например, в Windows комбинация клавиш Win + R, выполнить команду cmd) или удобный файл-менеджер с командной строкой, переходим в папку widget командами

d:
cd \widget

(или переходим в папку виджета средствами файл-менеджера).

Можно проверить, работает ли деплой:

windeployqt -h

Наконец, деплоим проект:

windeployqt mywidget.exe

Пробуем запустить исполняемый файл. Работает. Думаете, всё? Как бы ни так. Возможно, часть либ всё равно берётся из папки Qt.

На момент написания заметки, некоторые библиотеки Qt не деплоит. Грешит он этим, например, с libstdc++-6.dll, libgcc_s_seh-1.dll, libwinpthread-1.dll.

Простой способ проверить таков - закрываем среду, из "Проводника" переименовываем папку Qt, например, в Qt1 (потом не забываем вернуть прежнее имя!)

Если просит какие-то dll - ищем их в папке bin с Qt, докидываем в папку widget и повторяем запуск.

Ну или ищем в инете, в таком случае следите, чтобы библиотека была именно для вашей платформы (х86 или х64)

Если при запуске виджет просто вылетает с неизвестной ошибкой, ищите программу Dependency Walker, открывайте там проект и смотрите, все ли библиотеки имеют нужную разрядность и какие вообще там есть проблемы.

Если всё хорошо, копию файла windeployqt.exe из папки проекта можно удалить, а также почистить вложенную папку translations от "лишних" языков, оставив только qt_en.qm и qt_ru.qm

Мой виджет из 27 Кб стал 52 Мб, но теперь запускается без поиска .dll :)

08.05.2021, 10:58 [1453 просмотра]


теги: windows софт qt

К этой статье пока нет комментариев, Ваш будет первым