Проблемы с развертыванием приложения Qt5 в окнах

Итак, у меня есть Visual Studio 2013 (версия сообщества) с установленной Qt addn, библиотеками Qt5 (32 бит), и я пытаюсь создать исполняемый файл, который не зависит от всех конфигураций разработки (он может использовать статические или общие библиотеки, я на данный момент это неважно).

ОС: Windows 7, x64.

Для этого я изменил параметр Solution Confguration visual studio от Debug до Release и добавил все необходимые библиотеки в Configuration Properties -> Linker -> Input -> Additional Dependencies. Приложение теперь запускается, только если я запускаю его из визуальной среды IDE. Если я попытаюсь запустить его из сгенерированной .exe, я получил ошибку The application was unable to start correctly (0xc000007b).

Я искал и обнаружил, что этот код ошибки указывает на одну из следующих проблем:

  • 32-разрядное приложение пытается загрузить 64-разрядную DLL (не в моем случае, я думаю, Qt DLL 32-битные (я установил с помощью этого .exe: qt-opensource-windows-x86-msvc2013-5.5.0.), и я использую некоторые другие .DLL, которые также 32bit).
  • Есть некоторые недостающие DLL. (Я скопировал все необходимые Qt DLL в той же папке с окончательным исполняемым файлом).

Для проверки того, какие зависимости требуется моему приложению, я открыл файл .exe с помощью приложения Dependency Walker, вот что он мне показывает:

зависимости приложений

в этом списке также были Qt5Multimedia.dll и Qt5SerialPort.dll, я избавился от ошибок, скопировав .DLLs в ту же папку с .exe.

Есть идеи, как это решить?

Ответ 1

Вы никогда не должны выполнять эту операцию вручную, если стандартная процедура не завершится полностью. Существует уже стандартный инструмент для Qt Windows deploymend windeployqt.

Он заботится о зависимостях Qt DLL, делает копию platforms\qwindows.dll, а также делает копию библиотек, которые вы не можете обнаружить с помощью Dependency Walker, поскольку плагины изображений и некоторые другие загружаются во время выполнения.

Вам даже не нужно иметь свою папку Qt bin в вашей среде PATH. Простейшее развертывание:

  • копировать встроенную exe в новую папку
  • откройте консоль cmd в этой папке
  • вызов windeployqt с использованием его полного пути (если он не находится в системе PATH) и предоставить ваш исполняемый файл, например:
    c:\Qt\Qt5.5.1-vs2013-x64\5.5\msvc2013_64\bin\windeployqt.exe application.exe
    

В результате у вас есть в этой папке все необходимые библиотеки Qt DLL. Конечно, у вас также могут быть проблемы с распространенными распространяемыми MSVC, но их следует развернуть отдельно и установить один раз для каждой системы.

Инструмент windeployqt имеет различные параметры. Он также может позаботиться о развертывании связанных файлов qml.

Только некоторые сторонние библиотеки должны быть скопированы вручную, если они используются, например OpenSSL.

Ответ 2

Решение:

По мере того как я углубился, я нашел этот ответ, после того, как он указал то, что указывает этот ответ (я фактически скопировал все .DLLs, расположенные в \Qt5.5.0\5.5\msvc2013\bin, на где находится мой .exe), сообщение об ошибке изменилось с The application was unable to start correctly (0xc000007b) на Application failed to start because it could not find or load the QT platform plugin "windows".

Поиск в Интернете для получения дополнительной информации об этой ошибке, я нашел из этого ответ, что вам также нужна папка platforms в том же месте с .exe (который находился в пути Qt5.5.0\5.5\msvc2013\plugins). После копирования этой папки приложение запускается без проблем!!!

Теперь мне просто нужно удалить все ненужные .DLLs из папки моего приложения (Dependency Walker не предлагает очень полезную информацию об этом), и все развертывание завершено.

Я решил проблему в то же время, что и ее описание, поэтому, я думаю, я просто оставлю это здесь, может помочь другим, у которых есть та же проблема.