web-dev-qa-db-fra.com

L'application n'a pas pu démarrer car elle n'a pas pu trouver ou charger le plug-in "Windows" de la plateforme QT.

J'ai parcouru toutes les questions qui semblent liées au dépassement de capacité de la pile et aucune des solutions ne semble m'aider.

Je construis une application Qt avec cette configuration:

  • Windows 7 Professionnel x64
  • Visual Studio 2012
  • Qt 5.2.0 construit avec configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
  • Le projet utilise QtSingleApplication (qt-solutions)
  • L'application est une application 32 bits
  • qmake s'exécute avec les éléments suivants: -makefile -spec win32-msvc2012
  • .pri utilise QMAKE_CXX += /D_USING_V110_SDK71_

Je peux construire et exécuter mon programme correctement sur ma machine de développement (indiquée ci-dessus); Je peux également installer et exécuter le package à partir du répertoire Program Files sur la machine dev.

Quand j'installe et exécute sur un ordinateur Windows Vista (plusieurs ordinateurs)

  • VC++ redist 2012 11.0.61030.0 installé
  • VC++ redist 2010 10.0.40219 installé
  • plus les versions 2005 et 2008 de redist

(échoue également lors d'une nouvelle installation de Windows 7)

Je reçois: 

Application failed to start because it could not find or load the QT platform plugin "windows"

J'ai donc suivi les instructions et ajouté un répertoire .platforms /, et ajouté qwindows.dll (également ajouté qminimal.dll et qoffscreen.dll); J'ai aussi ajouté libEGL.dll, libGLESv2.dll (même si je n'aurais pas dû en avoir besoin, je ne pense pas)

Une fois que j'ai ajouté qoffscreen.dll, je reçois maintenant le message supplémentaire: Available platform plugins are: offscreen

Si je cours avec Dependency Walker, l'erreur suivante apparaît:

GetProcAddress(0x76CA0000 [KERNEL32.DLL], "GetCurrentPackageId") called from "MSVCR110.DLL" at address 0x6AC6FDFA and returned NULL. Error: The specified procedure could not be found (127).

et puis plus bas obtenir le:

GetProcAddress(0x745A0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x745FFBF8 and returned 0x745AE18C.
This application failed to start because it could not find or load the Qt platform plugin "windows".

Available platform plugins are: offscreen.

Reinstalling the application may fix this problem.

Des idées comment résoudre ce problème de DLL?

21
gollumullog

Bien, j'ai résolu mon problème, bien que je ne sois pas sûr de la différence:

J'ai copié chaque dll de mon répertoire qt dans ./ et ./platforms de mon répertoire d'application.

L'application a passé l'erreur, mais s'est écrasée.

VERSION.dll causait le plantage (indiqué dans Depend Walker), je l’ai donc supprimé des deux côtés.

L'application a démarré, j'ai donc systématiquement supprimé toutes les dll inutiles.

Cela m'a ramené dans le même état que j'avais à l'origine.

J'ai ensuite désinstallé mon application et réinstallé (avec seulement le fichier ./platforms/qwindows.dll restant), l'application fonctionne correctement.

Donc, tout ce que je peux supposer, c’est que j’avais une version incorrecte de qwindows.dll dans le répertoire plates-formes.

1
gollumullog

L'erreur est due au fait que le programme ne trouve pas qwindows.dll

qwindows.dll doit être dans un dossier nommé platforms pour que le chemin de votre exécutable à la dll soit platforms/qwindows.dll

Considérant que cela ne suffisait pas dans mon cas. Je devais aussi ajouter la ligne suivante au début de ma main ()

QCoreApplication::addLibraryPath("./");

Ensuite, tout a fonctionné.

22
Jan Moritz

J'ai eu ce problème et comment je l'ai résolu:

  1. Dépendance utilisée Walker ( http://www.dependencywalker.com/ ) pour voir le chemin exact des dll nécessaires. Essayez-le car QtCreator et QT Framework ont ​​tous les deux la même DLL et vous devez déterminer exactement celle qui est utilisée .. J'ai copié toutes les DLL nécessaires dans le même dossier que l'application.

  2. J'ai copié les plates-formes de dossiers à partir de QT framework/plugins et les ai copiées dans le même dossier que l'application. Maintenant, l'application a également plugin/platform/folder avec toutes ses dll

  3. Et l’étape la plus importante dans mon cas est de créer un fichier nommé qt.conf dans le même dossier que l’application. Ce fichier doit contenir le chemin d'accès aux plugins. Mon fichier qt.conf contient:

    [Chemins]
    Bibliothèques = ../lib/qtcreator
    Plugins = plugins
    Importations = importations
    Qml2Imports = qml

9
Lucian

L'application peut s'exécuter sur le système hôte, car le chemin Qt bin se trouve dans la variable système PATH.

Il existe un outil Qt standard pour le déploiement d'applications Qt sous Windows windeployqt afin de pouvoir exécuter l'application sur des machines cibles sur lesquelles Qt n'est pas installé.

Cet outil prend en charge les dépendances Qt DLL, crée une copie de platforms\qwindows.dll et crée également une copie des bibliothèques que vous ne pouvez pas détecter avec Dependency Walker, car les plug-ins d'image et d'autres DLL sont chargés à l'exécution .

Vous n'avez même pas besoin d'avoir votre dossier Qt bin dans votre environnement PATH. Le déploiement le plus simple:

  • copier le binaire exe construit dans un nouveau dossier
  • ouvrir la console cmd dans ce dossier
  • appelez windeployqt en utilisant le chemin complet (s'il ne se trouve pas dans le système PATH) et fournissez votre exécutable, par exemple:
    c:\Qt\Qt5.2.1\5.2.1\msvc2010_opengl\bin\windeployqt.exe application.exe
    

En conséquence, vous avez dans ce dossier toutes les DLL Qt nécessaires à l'exécution de l'application.

L'outil windeployqt a différentes options. Il peut également s’occuper du déploiement des fichiers associés à qml.

Bien sûr, vous pouvez également rencontrer des problèmes avec les redistribuables MSVC, mais ceux-ci doivent être déployés séparément et installés une fois par système.

Seules certaines bibliothèques tierces doivent être copiées manuellement si elles sont utilisées, par exemple OpenSSL.

8
Orest Hera

J'ai eu le même problème "L'application n'a pas pu démarrer car elle ne pouvait ni trouver ni charger le plug-in de la plate-forme QT" windows "

Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll et un répertoire "plateformes" avec qminimal.dll, qoffscreen.dll, qwindows.dll.

 enter image description here

 enter image description here

J'espère que cela aidera quelqu'un

4
Amar

Notez que ce problème peut aussi _ être causé si le chemin de recherche pour qwindows.dll qui est codé dans votre application inclut le chemin où vous avez installé Qt. Considérez le scénario suivant:

  1. J'installe Qt à c:\Qt\...
  2. Je développe une application et la déploie correctement ailleurs.
  3. Il fonctionne correctement sur n’importe quel ordinateur car il contient qwindows.dll dans un sous-répertoire.
  4. Je mets à niveau mon Qt local vers une nouvelle version.
  5. J'essaie de relancer mon application.

Le résultat est cette erreur, car le qwindows.dll dans c:\Qt\... est trouvé avant celui de son répertoire local et il est incompatible avec celui-ci. Très ennuyant.

Une solution consiste à placer un fichier qt.conf dans le même répertoire que votre fichier exe. Je ne sais pas comment éviter ça. Si vous avez utilisé l'outil windeployqt.exe pour déployer votre application, de sorte que vous ayez un sous-répertoire appelé platforms, cela suffit alors:

[Paths]
Plugins=.
3
Timmmm

Pour les personnes qui ont ce problème à l'avenir - j'ai un sale petit bidouillage, j'ai travaillé pour moi. Essayez à vos risques et périls.

Suivez toutes les étapes de Déploiement initial (Rapide et sale) [ http://wiki.qt.io/Deploy_an_Application_on_Windows]

  1. Fermer Qt Creator. 
  2. Copiez les éléments suivants dans C:\Deployment\La version finale de MyApp.exe Tous les fichiers .dll de C:\Qt\5.2.1\mingw48_32\bin\Tous les dossiers de C:\Qt\5.2.1\mingw48_32\plugins \
  3. (Si vous avez utilisé QML) Tous les dossiers de C:\Qt\5.2.1\mingw48_32\qml\Renommer C:\Qt\à C:\QtHidden\(Ceci transforme votre PC en un environnement propre, semblable à celui qui Qt n'est pas installé).
  4. Lancez C:\Deployment\MyApp.exe.

Maintenant pour le hack -

  1. Dupliquez votre dossier pour plus de sécurité
  2. Si votre fichier était dans/cat/Deployment, allez dans/cat
  3. Supprimez maintenant le dossier de déploiement pendant que le fichier .exe est toujours en cours d'exécution.
  4. Il vous dira qu'il ne peut pas supprimer certains fichiers, alors dites Sauter (ou tout ignorer)
  5. Ce qui vous reste est la liste de tous les fichiers .dll que votre .exe utilisait et ne pouvait pas supprimer: la liste de tous les fichiers et uniquement des fichiers que vous devez conserver.

Vous pouvez fermer le fichier .exe maintenant . Pour vérifier s’il se déploie correctement, allez dans le dossier où vous l’avez installé, dites C:/Qt et renommez-le en C:/NotQt (en gros, rendre Qt invisible pour le système. ) . Si cela fonctionne maintenant, il se déploiera plus souvent sur d’autres systèmes.

2
vc669

Pour moi, je devais définirQT_QPA_PLATFORM_PLUGIN_PATH dans le répertoire des plates-formes, puis cela fonctionnait.

Pour ce que ça vaut, cette solution a aussi été mentionnée sur GitHub .

1
RuiDC

Il manque qwindows.dll, qui devrait normalement se trouver sur les plates-formes, sauf si vous ajoutez:

QCoreApplication::addLibraryPath("<yourpath>");

Si vous ne le faites pas et placez votre qwindows.dll ailleurs, Qt recherchera la DLL dans votre PATH, ce qui peut prendre BEAUCOUP de temps (10 à plusieurs minutes)!

1
Ruud van Gaal

J'ai le même problème: 1. il peut fonctionner dans VS2010; 2. Il peut être exécuté dans un dossier contenant des fichiers tels que: app.exe \plates-formes\qwindows.dll ...

  1. mais il n’a pas été possible de charger qwindows sur une machine propre avec le même système d’exploitation que celui en développement.

Résolue simplement en déplaçant le dossier de la plate-forme dans les plugins: App.exe Plugins\platform\qwindows.dll


plus: qwindows.dll peut être renommé comme bon vous semble car il est interrogé par un plugin interafce: qt_plugin_query_metadata ()

1
chime

J'ai essayé tout ce qui est mentionné ci-dessus. Il s'est avéré que c'était simplement parce que je n'avais pas les principales DLL Qt dans le dossier apps 

  • Qt5Core.dll 
  • Qt5Widgets.dll 
  • etc
0
Rob Hirst

J'ai corrigé cela en plaçant qt.conf dans le dossier exe de mon application:

[Paths]
Prefix=C:/Qt/Qt5.11.2/5.11.2/msvc2017

Où:

  1. J'ai installé un kit Qt personnalisé dans C:\Qt\Qt5.11.2\5.11.2\msvc2017
  2. qt.conf informe l'application du kit personnalisé via la propriété Prefix. Remarque: utilisez des barres obliques, pas des barres obliques inverses (!)
  3. Et, éventuellement, le dossier bin du kit Qt est inclus dans ma variable d'environnement PATH

Définir Prefix dans votre fichier qt.conf lui permet de trouver le plugin plateforme qwindows.dll au démarrage de votre application.

0
Stephen Quan