Qt 5.1.1:应用程序无法启动,因为缺少平台插件“windows”

问题描述 投票:110回答:16

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


是的,我使用了搜索:

Failed to load platform plugin "windows". Available platforms are : Error

Deploying Qt C++ Application from Visual Studio qwindows.dll error

failed to load platform plugin "windows" Available platforms are: windows, minimal

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

但是,当从“release”-Folder开始时,我收到以下消息:

此应用程序无法启动,因为它无法找到或加载Qt平台插件“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。如果我像其他一些用户那样将它重命名为“平台”并不重要。 Qt仍然没有找到“平台插件窗口”,我的错误在哪里?

c++ windows qt visual-studio-2012
16个回答
63
投票

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

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


1
投票

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

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

如果继续出现错误,那就是缺少更多的库。使用“Dependency Walker”程序,您可以检测到一些丢失的文件夹。当然它会向您表明您需要一个NVIDIA .dll,它会告诉您该位置。

另一种方法,而不是使用“Dependency Walker”是从您的可执行文件旁边的“C:\ Windows \ System32”文件夹中复制所有.dll。执行你的.exe,如果一切都加载好,所以你没有在你不需要或使用的dll库中占用空间,使用带有所有选项的.exe程序,而不关闭你执行的.exe就是擦除所有。您刚刚复制到.exe旁边的DLL,所以如果您的程序正在使用这些.dll,系统将不会让您擦除,只删除那些不必要的。

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

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


0
投票

对于MinGW平台,如果您通过手工编写的CMakeLists.txt编写调试目标,则需要将qwindows.dll添加到平台目录中。 windeployqt可执行文件运行良好但似乎由于一些奇怪的原因,CMake构建也需要发布版本。总之,最好在平台目录中同时使用qwindows.dll和qwindowsd.dll。在QtCreator中导入CMake项目然后运行构建过程时,我没有注意到同样奇怪的结果。在命令行上编译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会自动部署您的应用程序。如果在正确设置envirenmentvariables的情况下启动提示,则会将其部署到当前目录。你找到一个脚本的例子:

@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文件夹中所有程序的所有(通用)支持dll都在这里。在我们的示例中,这将是Dll-Download:只需解压缩到“lib”目录中。你向下滚动demos-page,内容越令人印象深刻。就我而言,polyhedron-demo似乎是正确的。如果在我的10+笔记本上运行,我印象深刻。所以我在“CGAL”目录中创建了一个文件夹“demo”,旁边是“lib”。现在在该文件夹中创建一个.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窗口”就会保持打开状态。关闭shell窗口,你也杀了* .exe。无论你复制“CGAL”文件夹,因为奇怪的“%~dp0”-wriggle表示我们开始的* .cmd文件的完整路径,尾随“\”。所以“%me%lib”始终是实际库的完整路径(在我的例子中是“CGAL \ lib”)。接下来的两行告诉Qt其“运行时”文件的位置。这至少是Windows-Qt程序的文件“qwindows.dll”加上任意数量的* .dll。如果我没记错的话,Dll-library(至少当我下载它时)有一点“bug”,因为它包含了“platforms”目录,其中包含qwindows.dll。因此,当您打开lib目录时,需要在“平台”旁边创建一个“插件”文件夹,然后进入“插件”。如果Qt-app,任何Qt-app都找不到“qwindows.dll”,它就找不到“windows”。并且它期望它位于“plugins”目录中名为“platforms”的目录中,它必须由操作系统告知它运行...并且如果“QT_PLUGIN_PATH”并不完全指向所有helper-dlls你需要,一些Qt程序仍将运行没有probs。有些人抱怨你从未听过*。


0
投票

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


34
投票

我在我的exe位置旁边创建了一个平台目录并将qwindows.dll放入其中,但我仍然收到“无法加载平台插件”窗口“。可用平台是: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复制时,一切正常。


21
投票

我发现了一个意外但直观的修复。如果您将用于发布应用程序的编辑器的bin中的qwindows.dll复制并粘贴到名为“platforms”的文件夹中,则可以将该文件夹移动到与应用程序相同的目录中,就像魔术一样。

另外一个有用的提示,Qt附带平台控制台应用程序,它将所有依赖项(包括qwindows.dll和libEGL.dll等)添加到已部署的可执行文件的文件夹中。 windows的应用程序称为windeployqt,文档可以在这里找到http://doc.qt.io/qt-5/windows-deployment.html


12
投票

QT_QPA_PLATFORM_PLUGIN_PATH环境变量设置为%QTDIR%\ plugins \ platforms \ worked for me

还有人提到herehere


7
投票

我碰到了这个,我找不到任何答案。 我的同事在他的机器上安装了Qt(5.6.0):C:\ Qt \ Qt5.6.0 \ 5.6 \ msvc2015 \ plugins 我把Qt(5.6.2)安装在同一个位置。 我从这篇文章中了解到:http://www.tripleboot.org/?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旁边。

QCoreApplication::addLibraryPath(".");

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

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

5
投票

创建dir platforms并复制qwindows.dll到它,platformsapp.exe在同一个目录

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

文件夹结构 + app.exe + platforms\qwindows.dll


3
投票

我发现了另一个解决方在app文件夹中创建qt.conf:

[Paths]
Prefix = .

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


2
投票

这些答案大多包含良好(正确)的信息,但在我的情况下,仍然有一些缺失。

我的应用程序是作为库(DLL)构建的,并由非Qt应用程序调用。我使用windeployqt.exe在安装目录中设置Qt dll,平台,插件等,但它仍然找不到该平台。经过一些实验,我意识到应用程序的工作目录设置为不同的文件夹。所以,我使用GetModuleHandleExA抓住dll“生活”的目录,并在运行时使用该目录添加到Qt库路径

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

这对我有用。


1
投票

我在使用QT 5.6,Anaconda 4.3.23,python 3.5.2和pyinstaller 3.3时遇到了这个问题。我创建了一个python程序,其中包含使用QTcreator开发的界面,但必须将其部署到其他计算机,因此我需要使用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首先生成的文件)以包含以下行:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.