Implementación de la aplicación Qt 5 en Windows

He escrito un par de aplicaciones en QML (parte de Qt 5). En una pregunta que hice anteriormente ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), encontré la solución para implementar mi aplicación en OS X (usando la herramienta macdeployqt).

Implementar aplicaciones Qt4 en Windows fue fácil:

  1. Lo compiló en modo de lanzamiento.
  2. Copiaste las bibliotecas necesarias (DLL).
  3. Has probado y funcionó.

Desafortunadamente, este enfoque no funcionaba en Qt5 (incluso incluí la carpeta de plataformas con el archivo qwindows.dll y no funcionó). Después de algunos días de intentarlo, me di por vencido y compilé una versión estática de Qt5.

Nuevamente, no funcionó. La aplicación funciona en una PC con Qt instalado, pero se cuelga en PC “limpias”. Como nota al margen, los sistemas Windows 8 / 8.1 no dan una advertencia o un mensaje que me notifique sobre el locking de la aplicación. Pero en Windows 7, un mensaje me notifica que la aplicación se bloqueó.

He intentado ejecutar Dependency Walker (depends.exe) y todas las bibliotecas en la comstackción estática de mi aplicación parecían correctas.

En Windows 8, no obtengo ningún error. Pero después de crear un perfil de la aplicación en depends.exe, obtengo una infracción de acceso que se origina en QtGui.dll. El error exacto es

La segunda oportunidad de excepción 0xC0000005 (Infracción de acceso) ocurrió en “QT5GUI.DLL” en la dirección 0x61C2C000.

¿Hay algo que me falta (digamos un archivo DLL o config extra)?

Información de la aplicación:

  • Escrito y comstackdo con Qt 5.2.1
  • Utiliza Quick / QML.
  • Utiliza el módulo de red.
  • Utiliza el módulo webkit.
  • Utiliza el módulo bluetooth.
  • Los archivos QML están escritos en Quick 2.2

A partir de Qt 5.2, hay windeployqt herramienta windeployqt que puede usar. Simplemente ejecútalo desde la línea de comando para obtener ayuda. Pero el uso básico es, dale el archivo .exe, copiará las dependencias Qt para ir con él.

Deberá usar la opción --qmldir para que la herramienta sepa dónde están sus archivos QML, para que pueda descubrir las dependencias QML necesarias.

Nota sobre las pruebas: para asegurarse de que tiene todo, pruebe en la computadora sin Qt SDK, o cambie temporalmente el nombre del directorio Qt. De lo contrario, la aplicación podría encontrar archivos faltantes desde allí …

Después de algunas horas cavando en los foros de Qt, descubrí que necesito copiar la carpeta “qml” (normalmente ubicada en C: /Qt/5.2.1/qml) en el directorio raíz de la aplicación. Después de hacerlo, las versiones dinámica y estática de mi aplicación funcionaban en los sistemas de vanilla.


Directorio de progtwigs (MinGW 4.8 de 32 bits, dynamic):

Como hyde dijo, use la herramienta windeployqt ( \\bin\windeployqt.exe ) para copiar los archivos nescesary a la carpeta de su aplicación. Después de eso, copie los componentes QML requeridos desde \\qml\ a la carpeta de su aplicación. La carpeta resultante debe ser similar a:

  • plataformas (carpeta)
  • QtQuick (carpeta)
  • QtQuick.2 (carpeta)
  • Cualquier otro componente QML que necesite
  • app.exe
  • icudt51.dll
  • icuin51.dll
  • icuuc51.dll
  • libgcc_s_dw2-1.dll
  • libstdc ++ – 6.dll
  • libwindthread-1.dll
  • Qt5Core.dll
  • Qt5Gui.dll
  • Qt5Qml.dll
  • Qt5Quick.dll
  • Qt5Network.dll
  • Qt5Widgets.dll

Directorio de progtwig (estático)

Compile la aplicación de forma estática y luego copie los componentes QML necesarios de \\qml\ a la carpeta de la aplicación. La carpeta resultante debe ser similar a:

  • QtQuick (carpeta)
  • QtQuick.2 (carpeta)
  • Cualquier otro componente QML que necesite
  • app.exe

Creo que la causa del locking fue que el Qt5Gui.dll (dynamic y estático) “intentó” cargar las carpetas QtQuick * durante el tiempo de ejecución, pero no pudo encontrarlas (lo que provocó el locking de la aplicación durante la carga).