Implantando o aplicativo Qt 5 no Windows

Eu escrevi alguns aplicativos em QML (parte do Qt 5). Em uma pergunta que fiz antes ( https://softwareengineering.stackexchange.com/questions/213698/deploying-qt-based-app-on-mac-os-x ), encontrei a solução para implantar meu aplicativo em OS X (usando a ferramenta macdeployqt).

A implantação de aplicativos Qt4 no Windows foi fácil:

  1. Você compilou no modo de liberação.
  2. Você copiou as bibliotecas necessárias (DLLs).
  3. Você testou e deu certo.

Infelizmente, essa abordagem não funcionou no Qt5 (inclusive incluí a pasta de plataformas com o arquivo qwindows.dll e não funcionou). Depois de alguns dias de tentativas, desisti e compilei uma versão estática do Qt5.

Mais uma vez, não funcionou. O aplicativo funciona em um PC com o Qt instalado, mas ele cai em PCs “limpos”. Como uma nota lateral, os sistemas Windows 8 / 8.1 não dão um aviso ou uma mensagem me notificando sobre o travamento do aplicativo. Mas no Windows 7 uma mensagem me avisa que o aplicativo falhou.

Eu tentei executar Dependency Walker (depends.exe) e todas as bibliotecas na compilation estática do meu aplicativo parecia bem.

No Windows 8, não recebo nenhum erro. Mas depois de criar o perfil do aplicativo em depends.exe, recebo uma violação de access proveniente de QtGui.dll. O erro exato é

Segunda chance exceção 0xC0000005 (violação de access) ocorreu em “QT5GUI.DLL” no endereço 0x61C2C000.

Existe algo que estou faltando (digamos uma DLL extra ou arquivo de configuração)?

Informações da aplicação:

  • Escrito e compilado com o Qt 5.2.1
  • Usa Quick / QML.
  • Usa o módulo de rede.
  • Usa o módulo do webkit.
  • Usa o módulo bluetooth.
  • Os arquivos QML são escritos em Quick 2.2

   

A partir do Qt 5.2, existe a ferramenta windeployqt que você pode usar. Basta executá-lo na linha de comando para obter ajuda. Mas o uso básico é, dar-lhe o arquivo .exe, ele irá copiar dependencies Qt para ir com ele.

Você desejará usar a opção --qmldir para permitir que a ferramenta saiba onde seus arquivos QML estão, para que possa descobrir as dependencies QML necessárias.

Nota sobre testes: para ter certeza de que você tem tudo, teste no computador sem o Qt SDK ou renomeie temporariamente o diretório Qt. Caso contrário, o aplicativo pode encontrar arquivos ausentes de lá …

Depois de algumas horas explorando os fóruns do Qt, descobri que preciso copiar a pasta “qml” (normalmente localizada em C: / Qt/5.2.1/qml) para o diretório raiz do aplicativo. Depois disso, as versões dinâmica e estática do meu aplicativo funcionavam em sistemas de baunilha.


Diretório de programas (MinGW 4.8 de 32 bits, dynamic):

Como disse o hyde , use a ferramenta windeployqt ( \\bin\windeployqt.exe ) para copiar os arquivos nescessários para a pasta do seu aplicativo. Depois disso, copie os componentes QML necessários de \\qml\ para a pasta do seu aplicativo. A pasta resultante deve ser semelhante a:

  • plataformas (pasta)
  • QtQuick (pasta)
  • QtQuick.2 (pasta)
  • Quaisquer outros componentes QML que você precisa
  • 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

Diretório do programa (estático)

Compile o aplicativo estaticamente e, em seguida, copie os componentes QML necessários de \\qml\ para a pasta do seu aplicativo. A pasta resultante deve ser semelhante a:

  • QtQuick (pasta)
  • QtQuick.2 (pasta)
  • Quaisquer outros componentes QML que você precisa
  • app.exe

Eu acho que a causa do acidente foi que o Qt5Gui.dll (dynamic e estático) “tentou” para carregar as pastas QtQuick * durante o tempo de execução, mas não conseguiu encontrá-los (assim, a aplicação falha durante o carregamento).