Qt 5.1.1:由于缺少平台插件“ Windows”,应用程序无法启动


124

编辑: 有些人开始将我的问题标记为重复。当我问这个问题时,请不要忘记存在许多类似的问题(例如,参见下面的列表)。但是,这些答案都不能解决我的问题。经过长时间的搜索,我发现一条注释已被所有指向丢失的lib的用户忽略。现在,几个月后,评论已更改为答案。但是,当我自己回答这个问题时,我打算通过直接提供解决方案来帮助其他人。不应忘记这一点,到目前为止,我的回答对很多人有所帮助。因此,我的问题绝对不是重复的。 顺便说一句:在顶部提供的链接中接受的答案不能解决问题


是的,我使用了搜索:

无法加载平台插件“ Windows”。可用的平台有:错误

从Visual Studio qwindows.dll错误部署Qt C ++应用程序

无法加载平台插件“ windows”可用平台为:Windows,最小

但是,就我而言,问题仍然存在。我将Qt 5.1.1与Visual Studio 2012一起使用,并在Windows 7上使用Qt Creator 2.8.1开发了我的应用程序。应用程序以“发布”模式编译,如果直接用Qt Creator启动,则可以执行。

但是,从“发布”文件夹开始时,我收到以下消息:

此应用程序无法启动,因为它找不到或加载Qt平台插件“ windows”。可用的平台插件有:最小,离屏,Windows。

文件夹结构如下所示:

release
+ gui.exe
+ icudt51.dll
+ icuin51.dll
+ icuuc51.dll
+ libGLESv2.dll
+ Qt5Core.dll
+ Qt5Gui.dll
+ Qt5Widgets.dll
+ platforms

平台是直接从Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ plugins \ platforms(例如qwindows.dll)复制的文件夹。是否像其他用户一样将其重命名为“ platform”也没关系。Qt仍然没有找到“平台插件窗口”,我的错误在哪里?


5
我有类似的问题。Windows 8.1 Qt 5.3.1 MinGW 32,动态链接。通过将DLL从Qt的文件夹复制到../MyApp/platforms/qwindows.dll来解决。注:没有“插件”目录路径
德米特里


遇到类似问题,请使用此工具Depends,该工具将向您显示DLL依赖关系以及由此产生的问题。您可以使用此工具对exe或dll文件进行静态分析,也可以使用它显示具有动态加载的DLL的应用程序的启动。
Flovdis

使用windeployQt
CrippledTable

Answers:


64

好的,发布在这里https://stackoverflow.com/a/17271172/1458552,而没有其他用户的关注:

libEGL.dll失踪了!即使在尝试启动应用程序时尚未报告此问题(已报告了所有其他* .dll,例如Qt5Gui.dll)。


2
就我而言:Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ bin(当然取决于您的Visual Studio版本)
匿名

8
您怎么知道丢失的dll是libEGL?
user1493046 2014年

4
您节省了我几小时!在Qt 5.3.1上
遇到

4
@ user1493046我设法使用depends及其配置文件模式(F7)来重现此文件。应用程序启动并显示错误后,libEGL.dll出现在依赖关系列表中。
青金石2014年

17
添加libEGL.dll无效。但是,设置以下环境变量对我有用:QT_QPA_PLATFORM_PLUGIN_PATH =%QTDIR%\ plugins \ platforms \
arsalank2 2015年

36

我在exe位置旁边创建了一个platforms目录,并将qwindows.dll放入其中,但是仍然收到“无法加载平台插件“ windows”。可用的平台为:windows”错误。

我已经从C:\ Qt \ Qt5.1.1 \ Tools \ QtCreator \ bin \ plugins \ platforms复制了qwindows.dll,该位置不正确。我查看了在Qt Creator中运行的调试日志,发现我的应用在调试器中运行时正在C:\ Qt \ Qt5.1.1 \ 5.1.1 \ mingw48_32 \ plugins \ platforms中查找。

当我从C:\ Qt \ Qt5.1.1 \ 5.1.1 \ mingw48_32 \ plugins \ platforms复制时,一切正常。


38
设置以下环境变量对我有用:QT_QPA_PLATFORM_PLUGIN_PATH =%QTDIR%\ plugins \ platforms \
arsalank2 2015年

24

该版本可能缺少库/插件,或者库位于错误的目录和/或来自错误的目录。

Qt的预期答案:使用windeployqt。请参阅最后一段进行解释

手动答案:

在与application.exe文件相同的目录中创建一个名为“ platforms”的文件夹。将在用于发布应用程序的任何编译器的/ bin中找到的qwindows.dll复制并粘贴到“ platforms”文件夹中。就像魔术一样。如果没有.dll,请检查plugins / platforms /(plugins /与bin /位于同一目录中)<-PfunnyGuy的注释。

似乎一个常见的问题是.dll来自错误的编译器bin。确保从与用于发布应用程序的编译器相同的编译器复制qwindows.dll。

Qt带有平台控制台应用程序,该应用程序会将所有依赖项(包括qwindows.dll和libEGL.dll之类的依赖项)添加到已部署的可执行文件的文件夹中。这是部署应用程序的预期方式,因此您不会错过任何库(这是所有这些答案的主要问题)。Windows的应用程序称为windeployqt。每个操作系统可能都有一个部署控制台应用程序。


1
这就是我需要的:请注意,qwindows.dll不在Qt平台安装的bin /中,而是在plugins / platforms /中,而plugins /与bin /位于同一目录中
PfunnyGuy

1
谢谢!总之,这些文件是:主目录中的Qt5Core.dll,Qt5Gui.dll,Qt5Widgets.dll和YourApp.exe,以及子目录中的platform \ qwindows.dll和platform \ libEGL.dll。
Pierre

1
windeployqt是正确的答案。我使用了它,并将它复制到.exe旁边。它消除了知道需要哪个dll以及不需要哪个dll的猜测
H. Al-Amri

14

QT_QPA_PLATFORM_PLUGIN_PATH环境变量设置为%QTDIR%\ plugins \ platforms \ 对我有用

这里这里也有人提到


3
尽管此答案可能会使它在您当前的计算机上运行,​​但对试图将其程序部署到其他计算机并需要专门确定缺少/需要哪些库的其他人没有帮助。
RTbecard '17

1
在2017年,这对我有用。我不会部署任何应用程序!使用Qt创建者只是Open \ New文件或项目... \ Qt Widgets应用程序,然后运行,它会崩溃并显示相同的消息。设置此变量有助于我。
Phiber 2009年

只需将plugins文件夹复制到即兴创建的“发行版”旁边,然后将env
变量

9

我遇到了这个问题,没有找到我能解决的答案。

我的同事在他的计算机上安装了Qt(5.6.0),位于:C:\ Qt \ Qt5.6.0 \ 5.6 \ msvc2015 \ plugins
我在同一位置安装了Qt(5.6.2)。

我从这篇文章中学到了:http : //www.tripleboot.org/? p= 536 p=536,Qt5Core.dll在首次安装Qt时具有写入其插件的位置。由于我的同事和我的Qt目录相同,但是安装了不同版本的Qt,因此需要一个不同的qwindows.dll文件。当我运行由他部署的exe时,它将使用C:\ Qt \ Qt5.6.0 \ 5.6 \ msvc2015 \ plugins \ platforms \ qwindows.dll文件,而不是。\ platforms子文件夹中的可执行文件旁边的文件。

为了解决这个问题,我在应用程序中添加了以下代码行,这似乎迫使它在查看Qt5Core.dll中的路径之前,在exe旁边查找“ platforms”子文件夹。

QCoreApplication::addLibraryPath(".");

我将上述行添加到QApplication调用之前的main方法中,如下所示:

int main( int argc, char *argv[] )
{
    QCoreApplication::addLibraryPath(".");
    QApplication app( argc, argv );
    ...
    return app.exec();
}

1
这对我qwindowsd.dll
有用

这个对我有用,因为提到了qwindowsd.dll,我知道我的应用是在调试模式下编译的,我确实安装了Qtxxxd.dll库,但是在平台文件夹中使用了qwindows.dll。
古斯塔沃·罗德里格斯

6

创建目录platforms 并复制qwindows.dll到该目录,platformsapp.exe位于同一目录中

cd app_dir mkdir platforms xcopy qwindows.dll platforms\qwindows.dll

资料夹结构 + app.exe + platforms\qwindows.dll


在问题中提到“平台是从Qt \ Qt5.1.1 \ 5.1.1 \ msvc2012 \ plugins \ platforms直接复制的文件夹,例如qwindows.dll。”
parasietje

@parasietje应用程序正在qwindows.dll目录中寻找platforms。我已发布此邮件,因为已修复它。在降票之前您要进行测试吗?
谢坤明'18

您的答案没有回答原始问题。您的答案暗示了原始海报已经尝试过的东西。
parasietje

3

我找到了另一个解决方案。如下在app文件夹中创建qt.conf:

[Paths]
Prefix = .

然后将plugins文件夹复制到app文件夹,它对我有用。


好的,我在MinGW,CMake,Qt 5.12环境中,无法使用windeploy工具。平台文件夹在那儿,但是没有用。用Qt-lib中的一个替换它也没有帮助。通过使用技巧(在复制文件夹之后)进行了修复。谢谢!
Marcel Petrick

2

这些答案大多数都包含良好(正确)的信息,但就我而言,仍然缺少一些内容。

我的应用程序是作为库(dll)构建的,并由非Qt应用程序调用。我曾经windeployqt.exe在安装目录中设置Qt dll,平台,插件等,但仍然找不到平台。经过一些试验,我意识到应用程序的工作目录被设置为另一个文件夹。因此,我抓取了dll使用的GetModuleHandleExA目录,并在运行时使用将该目录添加到Qt库路径中

QCoreApplication::addLibraryPath(<result of GetModuleHandleExA>);

这对我有用。


2

对我来说,解决方案是更正PATH变量。它以Anaconda3 \ Library \ bin作为最早的路径之一。该目录包含一些 Qt库,但不是全部。显然,这是一个问题。将C:\ Programs \ Qt \ 5.12.3 \ msvc2017_64 \ bin移到最前面PATH为我解决了该问题。


1

使用QT 5.6,Anaconda 4.3.23,python 3.5.2和pyinstaller 3.3时遇到此问题。我已经创建了一个使用QTcreator开发的接口的python程序,但是不得不将其部署到其他计算机上,因此我需要使用pyinstaller来创建可执行文件。

我发现如果设置以下环境变量,则可以在计算机上解决该问题:

QT_QPA_PLATFORM_PLUGIN_PATH:%QTDIR%\ plugins \ platforms \

QTDIR:C:\ Miniconda3 \ pkgs \ qt-5.6.2-vc14_3 \ Library

但是此解决方案仅适用于在这些文件夹中安装了conda和qt的PC。

为了解决这个问题并使可执行文件在任何计算机上都能工作,我必须编辑“ .spec”(由pyinstaller首先生成的文件)以包括以下行:

数据= [('C:\ Miniconda3 \ pkgs \ qt-5.6.2-vc14_3 \ Library \ plugins \ platforms * .dll','platforms'),]

该解决方案基于Jim G.和CrippledTable的答案


1

我遇到了同样的问题,并通过应用几件事解决了它。第一个,如果它是您使用Qt完成的程序。

在“ C:\ Qt \ Qt5.10.0 \ 5.10.0 \ msvc2017_64 \ plugins”文件夹(以我为例)中,您找到其他文件夹,其中一个是“ platforms”。该“平台”文件夹将被复制到您的.exe可执行文件旁边。现在,如果出现错误0xc000007d,则说明您没有复制该版本,因为它可以是32位或64位。

如果继续出现错误,则说明您缺少更多库。使用“ Dependency Walker”程序,您可以检测到某些丢失的文件夹。它肯定会向您指示您需要NVIDIA .dll,并告诉您位置。

另一种方法,而不是使用“ Dependency Walker”,是从可执行文件旁边的“ C:\ Windows \ System32”文件夹中复制所有.dll。执行您的.exe文件,如果一切正常,以便在不需要或使用的dll库中没有占用的空间,请选择所有选项使用.exe程序,并且无需关闭.exe即可擦除所有.exe文件。您刚刚复制到.exe旁边的dll,因此,如果程序正在使用这些.dll,则系统不会让您删除该dll,而仅删除那些不必要的文件。

希望这个解决方案能为您服务。

请记住,如果您的操作系统是64位,则这些库将位于System32文件夹中,如果您的操作系统是32位,则它们也将位于System32文件夹中。发生这种情况的原因是64位计算机中32位程序不会出现兼容性问题。SysWOW64文件夹包含32位文件作为备份。


它可以工作,但更像是一个临时解决方案。是否可以做一些事情,以使您不需要复制platform文件夹?
Oleg Yablokov

0

对于MinGW平台,如果要通过手工编写的CMakeLists.txt手工编写调试目标,则还需要将qwindows.dll也添加到平台目录中。windeployqt可执行文件运行良好,但似乎出于某些奇怪的原因,CMake构建也需要发行版本。总之,最好在平台目录中同时包含qwindows.dll和qwindowsd.dll。在QtCreator中导入CMake项目然后运行构建过程时,我没有注意到相同的奇怪结果。如果在正确的位置设置了Debug目标,则在命令行上编译CMake项目似乎会触发qwindows.dll依赖关系(qwindowsd.dll)


0

使用此批处理文件:RunWithQt.bat

@echo off
set QTDIR=C:\Qt\Qt5.1.1\5.1.1\msvc2012\bin
set QT_QPA_PLATFORM_PLUGIN_PATH=%QTDIR%\plugins\platforms\
start %1
  • 要使用它,请将您的gui.exe文件拖放到资源管理器中的RunWithQt.bat上,
  • RunWithQt gui.exe从命令行调用

0

如果您安装了Anaconda,我建议您将其卸载并尝试从源代码安装python软件包,我已通过这种方式解决了此问题


0

应用程序qtbase / bin / windeployqt.exe会自动部署您的应用程序。如果在环境变量设置正确的情况下启动提示,则提示将部署到当前目录。您会找到一个脚本示例:

@echo off
set QTDIR=E:\QT\5110\vc2017

set INCLUDE=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\include;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\include;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\include\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\ucrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\shared;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\um;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\winrt;C:\Program Files (x86)\Windows Kits\10\include\10.0.14393.0\cppwinrt

set LIB=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86;C:\Program Files (x86)\Windows Kits\NETFXSDK\4.6.1\lib\um\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\ucrt\x86;C:\Program Files (x86)\Windows Kits\10\lib\10.0.14393.0\um\x86;

set LIBPATH=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\ATLMFC\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86;S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.15.26726\lib\x86\store\references;C:\Program Files (x86)\Windows Kits\10\UnionMetadata\10.0.17134.0;C:\ProgramFiles (x86)\Windows Kits\10\References\10.0.17134.0;C:\Windows\Microsoft.NET\Framework\v4.0.30319;

Path=%QTDIR%\qtbase\bin;%PATH%
set VCIDEInstallDir=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\IDE\VC\
set VCINSTALLDIR=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\
set VCToolsInstallDir=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.11.25503\
set VisualStudioVersion=15.0
set VS100COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 10.0\Common7\Tools\
set VS110COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\Tools\
set VS120COMNTOOLS=S:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\
set VS150COMNTOOLS=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\Common7\Tools\
set VS80COMNTOOLS=C:\Program Files (x86)\Microsoft Visual Studio 8\Common7\Tools\
set VS90COMNTOOLS=c:\Program Files (x86)\Microsoft Visual Studio 9.0\Common7\Tools\
set VSINSTALLDIR=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\
set VSSDK110Install=C:\Program Files (x86)\Microsoft Visual Studio 11.0\VSSDK\
set VSSDK150INSTALL=S:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VSSDK
set WindowsLibPath=C:\Program Files (x86)\Windows Kits\10\UnionMetadata;C:\Program Files (x86)\Windows Kits\10\References
set WindowsSdkBinPath=C:\Program Files (x86)\Windows Kits\10\bin\
set WindowsSdkDir=C:\Program Files (x86)\Windows Kits\10\
set WindowsSDKLibVersion=10.0.14393.0\
set WindowsSdkVerBinPath=C:\Program Files (x86)\Windows Kits\10\bin\10.0.14393.0\
set WindowsSDKVersion=10.0.14393.0\
set WindowsSDK_ExecutablePath_x64=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\x64\
set WindowsSDK_ExecutablePath_x86=C:\Program Files (x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.6.1 Tools\

mkdir C:\VCProjects\Application\Build\VS2017_QT5_11_32-Release\setup
cd C:\VCProjects\Application\Build\VS2017_QT5_11_32-Release\setup
copy /Y ..\Release\application.exe .
windeployqt application.exe
pause

0

可以说,您想拥有一些可移植的CGAL-Demos。因此,您将拥有一个文件夹“ CGAL”,并在其中有一个名为“ lib”的子文件夹:CGAL文件夹中任何程序的所有(通用)support-dll都在这里。在我们的示例中,这将是Dll-Download:只需将其解压缩到“ lib”目录中即可。向下滚动到演示页面越深,内容就越令人印象深刻。就我而言,多面体演示似乎是正确的。如果这在我的10岁以上笔记本电脑上运行,我会印象深刻。因此,我在“ CGAL”目录中以及“ lib”旁边创建了一个文件夹“ demo”。现在在该文件夹中创建一个.cmd文件。我命名为“ Polyhedron.cmd”。所以我们有一个这样的目录结构:

 CGAL - the bag for all the goodies
  lib - all libraries for all CGAL-packages
 demo - all the demos I'm interested in
[...] - certainly some other collections, several apps per folder...
Polyhedron.cmd - and a little script for every Qt-exe to make it truly portable.

在此小示例中,“ Polyhedron.cmd”包含以下文本:

@echo off
set "me=%~dp0"
set PATH=%me%lib
set "QT_PLUGIN_PATH=%me%lib\plugins"
start /b "CGAL Polyhedron Demo" "%me%demo\polyhedron\polyhedron_3.exe"

显然,除了最后一行,所有脚本都可以相同。唯一的警告是:只要您使用实际程序,“ DOS窗口”就保持打开状态。关闭外壳窗口,并杀死* .exe。无论在何处复制“ CGAL”文件夹,因为怪异的“%〜dp0” -wroggle代表我们开始的* .cmd文件的完整路径,后跟“ \”。因此,“%me%lib”始终是实际库的完整路径(本例中为“ CGAL \ lib”)。接下来的2行告诉Qt它的“运行时”文件在哪里。这至少是Windows-Qt程序的文件“ qwindows.dll”加上任意数量的* .dll。如果我没记错的话,Dll库(至少在下载时)有一个小“ bug”,因为它包含带有qwindows.dll的“ platforms”目录。移动到“插件”中。如果Qt应用程序(任何 Qt应用程序)找不到“ qwindows.dll”,则找不到“ windows”。它期望它在“ plugins”目录中一个名为“ platforms”的目录中,操作系统必须告诉它运行在...上,并且如果“ QT_PLUGIN_PATH”未完全指向您所有的helper-dll需要时,某些Qt程序仍将没有问题运行。还有一些人抱怨缺少您从未听说过的* .dll ...


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.