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


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


是的,我用了搜索:

加载平台插件“ windows”失败。可用平台为: 错误

从 Visual Studio qwindows.dll 错误部署 Qt C + + Application

加载平台插件失败“ windows”可用的平台有: windows,最小

然而,在我的情况下,问题仍然存在。我在 Visual Studio 2012中使用 Qt 5.1.1,在 Windows 7中使用 Qt Creator 2.8.1开发了我的应用程序。应用程序在“发布”模式下编译,如果直接使用 Qt Creator 启动,则可以执行。

但是,当从“发布”-文件夹开始时,我得到以下信息:

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

文件夹结构如下:

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

平台是从 Qt Qt5.1.15.1.1 msvc2012插件平台直接复制的文件夹,包括 qwindows.dll。如果我像其他一些用户那样将它重命名为“平台”,这并不重要。Qt 仍然没有找到“平台插件窗口”,我的错误在哪里?

326722 次浏览

好的,正如在这里发布的 https://stackoverflow.com/a/17271172/1458552没有引起其他用户的注意:

LibEGL.dll不见了!即使在尝试启动应用程序时没有报告这一点(所有其他 *)。例如 Qt5Gui.dll)。

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

我从 C: Qt Qt5.1.1 Tools QtCreator bin 插件平台复制了 qwindows.dll,这不是正确的位置。我查看了在 Qt Creator 中运行的调试日志,发现我的应用程序在调试器中运行时正在查看 C: Qt Qt5.1.15.1.1 mingw48 _ 32插件平台。

当我从 C: Qt Qt5.1.15.1.1 ming w48 _ 32插件平台上复制时,一切工作正常。

QT_QPA_PLATFORM_PLUGIN_PATH环境变量设置为% QTDIR% plugins 平台。

也提到了 给你给你

我遇到了这个问题,我找不到任何答案。< br/> < br/> 我的同事在他的机器上安装了 Qt (5.6.0) : C: Qt Qt5.6.05.6 msvc2015插件
我在同一个位置安装了 Qt (5.6.2)。 < br/> < br/> 我从这篇文章中了解到: http://www.tripleboot.org/?p=536,Qt5Core.dll 在第一次安装 Qt 时有一个写入到它的插件的位置。 由于我的同事和我的 Qt 目录是相同的,但是安装了不同版本的 Qt,因此需要一个不同的 qwindows.dll 文件。当我运行他部署的 exe 时,它会使用我的 C: Qt Qt5.6.05.6 msvc2015插件平台 qwindows.dll 文件,而不是位于。平台子文件夹。

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

QCoreApplication::addLibraryPath(".");

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

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

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

[Paths]
Prefix = .

然后将插件文件夹复制到应用程序文件夹中,这对我很有用。

这个版本可能缺少一个库/插件,或者库位于错误的目录中,或者来自错误的目录。

Qt 预期的答案: 使用 Windloyqt。见最后一段解释

手动回答:

在与 application.exe 文件相同的目录中创建一个名为“ Platform”的文件夹。将 qwindows.dll 复制并粘贴到“ Platform”文件夹中,该文件位于用于发布应用程序的编译器的/bin 中。就像魔法一样有效。如果。Dll 不在那里,检查插件/平台/(插件/与 bin/在同一目录中) < —— PfunnyGuy 的注释。

似乎一个共同的问题是。Dll 是从错误的编译器仓中获取的。一定要从用于发布应用程序的编译器中复制 qwindows.dll。

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

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

我发现,如果我设置下列环境变量,问题就在我的电脑上解决了:

插件平台

C: Miniconda3 pkgs qt-5.6.2-vc14 _ 3库

但是这个解决方案只能在我的电脑上运行,因为我的电脑在那些文件夹中安装了 conda 和 qt。

为了解决这个问题,并使可执行工作在任何计算机上,我必须编辑。Spec”(由 pyinstaller 首先生成的文件)中包含以下代码行:

数据 = [( ‘ C: Miniconda3 pkgs qt-5.6.2-vc14 _ 3 Library plugins Platform * . dll’, 平台) ,]

这个解决方案是基于 Jim G 和 CrippledTable 的答案

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

使用这个批处理文件: 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 文件拖放到 Explorer 中的 RunWithQt.bat 上,
  • 或从命令行调用 RunWithQt gui.exe

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

Cd app _ dir Mkdir 平台 Xcopy qwindows.dll 平台 qwindows.dll

文件夹结构 + app.exe + 平台 qwindows.dll

我也遇到了同样的问题,我用几种方法解决了它。 第一个,如果它是一个你用 Qt 编写的程序。

在“ C: Qt Qt5.10.05.10.0 msvc2017 _ 64 plugins”的文件夹中(在我的例子中) ,你可以找到其他文件夹,其中之一是“ Platform”。“平台”文件夹将被复制到您的。可执行文件。现在,如果您得到错误0xc000007d 是您没有复制的版本,因为它可以是32位或64位。

如果你继续错下去,就是你缺少更多的库。通过“依赖行走”程序,你可以检测到一些丢失的文件夹。当然,它会向你表明,你需要一个 NVIDIA。Dll,它会告诉你位置。

另一种方法是,不使用“ DependencyWalker”,而是复制所有。从您的“ C: WindowsSystem32”文件夹下的可执行文件 dll。执行你的。如果所有内容都加载得很好,那么 dll 库中不会占用您不需要或不使用的空间,请使用。所有选项并且不关闭。你要做的就是删除所有。复制到。所以如果那些。你的程序正在使用 dll,系统不会让你删除,只会删除那些不必要的。

我希望这个解决方案对你有用。

请记住,如果您的操作系统是64位,那么库将位于 System32文件夹中,如果您的操作系统是32位,那么它们也将位于 System32文件夹中。这样就不会出现与64位计算机中32位程序的兼容性问题。 SysWOW64文件夹包含作为备份的32位文件。

如果你已经安装了 Anaconda,我建议你卸载它并尝试从源代码安装 python 软件包,我用这种方式解决了这个问题

这些答案大部分都包含了好的(正确的)信息,但是在我的例子中,仍然缺少了一些东西。

我的应用程序构建为一个库(dll) ,并由一个非 Qt 应用程序调用。我使用 windeployqt.exe在安装目录中设置 Qt dlls、平台、插件等,但仍然找不到平台。经过一些实验,我意识到应用程序的工作目录被设置到了一个不同的文件夹中。因此,我使用 GetModuleHandleExA获取 dll“生存”的目录,并在运行时使用

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

这招对我很管用。

应用程序 Qtbase/bin/winloyqt.exe会自动部署应用程序。如果启动一个提示符,并且正确设置了 envirenment 变量,那么它将被部署到工作目录。 你会发现一个脚本的例子:

@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

让我们说,你想有一些 CGAL-Demos便携式。所以你会有一个文件夹“ CGAL”,在这个文件夹中,有一个子文件夹叫做“ lib”: 所有(通用)的对 CGAL 文件夹中任何程序的 support-dlls 都放在这里。在我们的示例中,这就是 下载: 只需将压缩文件解压到“ lib”目录中。在 演示页面上向下滚动得越远,内容就越令人印象深刻。在我的案例中,多面体演示似乎是正确的。如果这在我的10 + Yo 笔记本上运行,我会印象深刻。因此,我在“ CGAL”-目录中创建了一个文件夹“ demo”,旁边是“ lib”。 现在在这个文件夹中创建一个. cmd-file,我把我的命名为“ 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-Window”只要你使用实际的程序就会一直打开。关闭 shell 窗口,然后关闭 * 。我也是。无论您在哪里复制“ CGAL”-文件夹,因为奇怪的“% ~ dp0”-wriggle 表示 * 的完整路径。Cmd 文件,我们开始,尾随“”。因此“% me% lib”始终是实际库的完整路径(在我的示例中是“ CGALlib”)。接下来的两行告诉 Qt 它的“运行时”文件在哪里。这至少是 Windows-Qt 程序的文件“ qwindows.dll”加上任意数量的 * 。Dls.如果我没记错的话,Dll-library (至少在我下载它的时候)有一个小“ bug”,因为它包含了 qwindows.dll 的“ Platform”-目录。因此,当您打开 lib 目录时,您需要在“ Platform”旁边创建一个文件夹“ plugins”,然后在“ plugins”中创建 让开。如果 Qt-app (任何 Qt-app)找不到“ qwindows.dll”,那么它就找不到“ windows”。它期望它在一个名为“平台”的目录中的“插件”目录,它必须得到告诉的操作系统的运行... 如果“ QT _ PLUGIN _ PATH”不完全指向所有的助手-dll 你需要的,一些 QT 程序仍然会运行没有问题。有人抱怨失踪 * 。你从未听说过的事情。

对我来说,解决方案是纠正 PATH变量。它有蟒蛇3图书馆作为第一批路径之一。此目录包含 一些 Qt 库,但不包含所有库。显然,这是个问题。移动 C: 程序 Qt 5.12.3 msvc2017 _ 64 bin 到 PATH的前面为我解决了这个问题。

对于任何来自 QT 5.14.0版本的人来说,我花了两天时间才找到这个 bug 声明:

Winloyqt 不工作的 MinGW QTBUG-80763将被固定在 5.14.1

Https://wiki.qt.io/qt_5.14.0_known_issues

因此,请注意,在 MinGW 中使用 winloyqt 将会产生同样的错误。

我在 Windows10(VS2019)中运行 QT5应用程序时遇到了同样的问题。 我的错误是

. . Debug Qt5Cored.dll
模组: 5.14.1
文件: kernel qguiapplication.cpp
线路: 1249 < br >

此应用程序启动失败,因为没有 Qt 平台插件可以初始化。 < br > 重新安装应用程序可以解决这个问题。

解决方案

因为我使用的是 QT msvc2017,所以我将插件文件夹从“ C: QT Qt5.14.15.14.1 msvc2017 plugins”位置复制到二进制位置

成功了。

然后检查视觉工作室输出窗口,并确定从插件文件夹加载的 dlls 和删除不需要的 dlls

QT_PLUGIN_PATH env 变量设置为 <...>/plugins目录对我也有效。

我遇到了同样的错误,并用一种不同于其他文章中提到的方法解决了它。希望这将有助于未来的读者。

建造:

Windows10(64位) Minicoda (使用 python3.9.4)(pkgs 来自 conda-forgeChannel) Pyqt 5.12.3

我的设想是:

我正在为一些嵌入式工作构建一个 GUI 应用程序。我有两台用于开发的机器(相同的操作系统和架构) ,其中一台没有互联网连接。在打包环境并安装到离线机器上之后,我遇到了您得到的错误。

解决方案:

在您的 conda 环境中找到 qt.conf 文件。 对我来说: C: 用户“ name”miniconda3 envs“ env _ name”qt.conf

确保路径正确。我需要更新“名称”,因为这是从旧机器遗留下来的。

希望这能帮到别人。

我在 Pycharm 试图运营 Matplot 时犯了个错误。我的解决方案是将 Anaconda3 Library 插件目录(例如: c: Program files Anaconda3 Library 插件)设置为环境变量“ QT _ PLUGIN _ PATH”。 设置您应该进入控制面板/系统/高级系统设置/环境变量。

主要谈 Windows 平台

在尝试使用 vcpkg安装的 Qt库调试应用程序构建时面临同样的问题,而我的应用程序构建使用 cmake。在找到解决办法之前有几个小时的麻烦。最简单的方法是这样做:

  • 在生成文件夹中,找到最终可执行文件所在的文件夹。

  • 在该文件夹中,您将找到一些 Qt库,如 Qt6Core.dll

  • 注意库文件的名称中是否有 d后缀,即 Qt6Cored.dll而不是 Qt6Core.dll

  • vcpkg文件夹中,有两个选项

    1. ./installed/x64-windows/Qt6/plugins/platforms
    2. ./installed/x64-windows/debug/Qt6/plugins/platforms
  • 如果存在 d后缀,则将 ../debug/..文件夹(另一个)的内容复制到同一文件夹中的 platforms文件夹中,您的可执行文件和 Qt库位于该文件夹中(如果没有这样的文件夹,则自己创建)。

您可以以某种方式自动化这个过程。任务就交给你了。如果我自己这样做,将更新的答案。

剪辑

如果你使用的是 CMakeLists,你可以尝试一下

# assuming your target's name is app


if(WIN32)
add_custom_command(
TARGET app POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_directory
${Qt6_DIR}/../../$<$<CONFIG:Debug>:debug/>Qt6/plugins/platforms/
$<TARGET_FILE_DIR:app>/platforms/
)
endif()