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:
configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
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)
(é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?
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.
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é.
J'ai eu ce problème et comment je l'ai résolu:
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.
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
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
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:
exe
construit dans un nouveau dossiercmd
dans ce dossierwindeployqt
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.
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:
c:\Qt\...
qwindows.dll
dans un sous-répertoire.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=.
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]
Maintenant pour le hack -
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.
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 .
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)!
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 ...
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 ()
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
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ù:
C:\Qt\Qt5.11.2\5.11.2\msvc2017
qt.conf
informe l'application du kit personnalisé via la propriété Prefix
. Remarque: utilisez des barres obliques, pas des barres obliques inverses (!)PATH
Définir Prefix
dans votre fichier qt.conf
lui permet de trouver le plugin plateforme qwindows.dll
au démarrage de votre application.