编辑:有些人开始将我的问题标记为重复。不要忘记当我问这个问题时存在许多类似的问题(参见下面的列表)。但是,这些答案都没有解决我的问题。经过长时间的搜索,我发现了一条被所有指向丢失库的用户忽略的评论。现在,几个月后,评论已更改为答案。但是,当我自己回答这个问题时,我打算通过直接提供解决方案来帮助其他人。这不应该被遗忘,到目前为止我的回答帮助了很多人。因此我的问题绝对不是重复的。顺便说一句:顶部提供的链接中接受的答案并不能解决问题!
是的,我使用了搜索:
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 上开发了我的应用程序。应用程序以“发布”模式编译,如果直接使用 Qt Creator 启动,则可以执行。
但是,从“发布”文件夹开始时,我收到以下消息:
此应用程序无法启动,因为它无法找到或加载 Qt 平台插件“windows”。可用的平台插件有:minimal、offscreen、windows。
文件夹结构如下所示:
release
+ gui.exe
+ icudt51.dll
+ icuin51.dll
+ icuuc51.dll
+ libGLESv2.dll
+ Qt5Core.dll
+ Qt5Gui.dll
+ Qt5Widgets.dll
+ platforms
Platforms 是直接从 Qt\Qt5.1.1\5.1.1\msvc2012\plugins\platforms 复制的文件夹,包括例如 qwindows.dll。如果我像其他一些用户那样将它重命名为“平台”也没关系。 Qt 仍然没有找到“平台插件窗口”,我的错误在哪里?
Depends
,它会向您显示 DLL 依赖关系以及由此产生的问题。您可以使用此工具对 exe 或 dll 文件进行静态分析,也可以使用它来显示具有动态加载的 DLL 的应用程序的启动情况。
好的,正如此处发布的 https://stackoverflow.com/a/17271172/1458552,其他用户没有过多关注:
libEGL.dll 丢失了!尽管在尝试启动应用程序时未报告此问题(已报告所有其他 *.dll,例如 Qt5Gui.dll)。
我在我的 exe 位置旁边创建了一个平台目录并将 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 复制时,一切正常。
该版本可能缺少库/插件,或者库位于错误的目录和/或来自错误的目录。
Qt 预期答案:使用 windeployqt。解释见最后一段
手动回复:
在 application.exe 文件所在的目录中创建一个名为“platforms”的文件夹。将 qwindows.dll(位于您用于发布应用程序的编译器的 /bin 中)复制并粘贴到“平台”文件夹中。就像魔术一样有效。如果 .dll 不存在,请检查 plugins/platforms/ (其中 plugins/ 与 bin/ 位于同一目录中)<-- PfunnyGuy 的评论。
似乎一个常见的问题是 .dll 是从错误的编译器 bin 中获取的。请务必从与用于发布您的应用程序的编译器相同的编译器复制您的 qwindows.dll。
Qt 带有平台控制台应用程序,这些应用程序会将所有依赖项(包括 qwindows.dll 和 libEGL.dll 之类的依赖项)添加到已部署的可执行文件的文件夹中。这是部署应用程序的预期方式,因此您不会错过任何库(这是所有这些答案的主要问题)。 Windows 应用程序称为 windeployqt。每个操作系统可能都有一个部署控制台应用程序。
windeployqt
使用方法:打开cmd或powershell,运行windeployqt.exe .\target.exe
。
将 QT_QPA_PLATFORM_PLUGIN_PATH
环境变量设置为 %QTDIR%\plugins\platforms\ worked for me。
我遇到了这个问题,但我找不到任何答案可以为我解决这个问题。
我的同事在他的机器上安装了 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();
}
qwindowsd.dll
...
The directory of the application executable (NOT the working directory) is always added followed by ....
似乎表明 addLibraryPath() 总是以当前 exe 目录作为参数调用。因此,只需将 qwindows.dll 放在 exe 旁边的平台文件夹中即可解决问题。
创建目录 platforms
并将 qwindows.dll
复制到其中,platforms
和 app.exe
在同一个目录中
cd app_dir mkdir platforms xcopy qwindows.dll platforms\qwindows.dll
文件夹结构 + app.exe + platforms\qwindows.dll
platforms
中寻找 qwindows.dll
。我发布这个是因为我已经修复了它。你在投票前做测试吗?
我找到了另一个解决方案。在 app 文件夹中创建 qt.conf,如下所示:
[Paths]
Prefix = .
然后将插件文件夹复制到应用程序文件夹中,它对我有用。
我在使用 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 的电脑。
为了解决这个问题并使可执行文件在任何计算机上运行,我必须编辑“.spec”(首先由 pyinstaller 生成的文件)以包含以下行:
datas=[('C:\Miniconda3\pkgs\qt-5.6.2-vc14_3\Library\plugins\platforms*.dll', 'platforms'),]
该解决方案基于 Jim G. 和 CrippledTable 的答案
对我来说,解决方案是更正 PATH
变量。它有 Anaconda3\Library\bin 作为第一条路径之一。该目录包含一些 Qt 库,但不是全部。显然,这是一个问题。将 C:\Programs\Qt\5.12.3\msvc2017_64\bin 移到 PATH
的前面为我解决了这个问题。
对于来自 QT 5.14.0 版的任何人,我花了 2 天时间才找到这个错误声明:
windeployqt 不适用于 MinGW QTBUG-80763 将在 5.14.1 中修复
https://wiki.qt.io/Qt_5.14.0_Known_Issues
所以要注意。将 windeployqt 与 MinGW 一起使用将给出此处所述的相同错误。
这些答案中的大多数都包含好的(正确的)信息,但就我而言,仍然缺少一些东西。
我的应用程序构建为库 (dll) 并由非 Qt 应用程序调用。我用windeployqt.exe
在安装目录下设置了Qt dll、平台、插件等,但还是找不到平台。经过一些实验,我意识到应用程序的工作目录设置为不同的文件夹。因此,我使用 GetModuleHandleExA
抓取了 dll“存在”的目录,并在运行时使用将该目录添加到 Qt 库路径中
QCoreApplication::addLibraryPath(<result of GetModuleHandleExA>);
这对我有用。
我有同样的问题,并通过应用几件事来解决它。首先,如果它是您使用 Qt 编写的程序。
在“C:\ Qt \ Qt5.10.0 \ 5.10.0 \ msvc2017_64 \ plugins”的文件夹(在我的情况下)中,您可以找到其他文件夹,其中之一是“平台”。该“平台”文件夹将被复制到您的 .exe 可执行文件旁边。现在,如果您收到错误 0xc000007d 是您没有复制原来的版本,因为它可以是 32 位或 64 位。
如果您继续出现错误,则说明您缺少更多库。使用“Dependency Walker”程序,您可以检测到一些丢失的文件夹。它肯定会向您表明您需要一个 NVIDIA .dll,并告诉您位置。
另一种方法是从可执行文件旁边的“C:\Windows\System32”文件夹中复制所有 .dll,而不是使用“Dependency Walker”。执行您的 .exe,如果一切正常,因此您不需要或使用不需要或使用的 dll 库中没有空间占用,请使用带有所有选项的 .exe 程序,并且在不关闭 .exe 的情况下删除所有 .exe 文件。您刚刚复制的.exe旁边的dll,因此如果您的程序正在使用这些.dll,系统不会让您擦除,只会删除那些不必要的。
我希望这个解决方案能为您服务。
请记住,如果您的操作系统是 64 位,库将在 System32 文件夹中,如果您的操作系统是 32 位,它们也将在 System32 文件夹中。发生这种情况是为了不存在与 64 位计算机中的 32 位程序的兼容性问题。 SysWOW64 文件夹包含 32 位文件作为备份。
对于 MinGW 平台,如果您是通过手工编写的 CMakeLists.txt 临时编写的 Debug 目标,您还需要将 qwindows.dll 添加到平台目录中。 windeployqt 可执行文件运行良好,但似乎出于某种奇怪的原因,CMake 构建也需要发布变体。总之,最好在您的平台目录中同时拥有 qwindows.dll 和 qwindowsd.dll。在 QtCreator 中导入 CMake 项目然后运行构建过程时,我没有注意到同样奇怪的结果。在命令行上编译 CMake 项目似乎会触发 qwindows.dll 依赖关系,或者如果为 Debug 目标设置了正确的依赖项(qwindowsd.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 文件拖放到资源管理器中的 RunWithQt.bat 上,
或从命令行调用 RunWithQt gui.exe
如果你安装了 Anaconda,我建议你卸载它并尝试从源代码安装 python 包,我以这种方式解决了这个问题
应用程序 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
比方说,您想要一些 CGAL-Demos 可移植的。因此,您将有一个文件夹“CGAL”,其中有一个名为“lib”的子文件夹:CGAL 文件夹中任何程序的所有(通用)support-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”)。接下来的 2 行告诉 Qt 它的“运行时”文件在哪里。这至少是用于 Windows-Qt 程序的文件“qwindows.dll”加上任意数量的 *.dll。如果我没记错的话,Dll 库(至少在我下载它时)有一个小“错误”,因为它包含“平台”目录,其中包含 qwindows.dll。所以当你打开lib目录时,你需要在“platforms”旁边创建一个文件夹“plugins”,然后移动到“plugins”中。如果一个 Qt 应用程序,任何 Qt 应用程序,没有找到“qwindows.dll”,它就找不到“windows”。并且它期望它在“plugins”目录中名为“platforms”的目录中,它必须被操作系统告知它正在运行......并且如果“QT_PLUGIN_PATH”不完全指向你的所有帮助程序-dll需要,一些 Qt 程序仍然可以毫无问题地运行。还有一些人抱怨缺少你从未听说过的 *.dll ......
我遇到了同样的错误,并用与其他帖子中提到的方法不同的方法解决了它。希望这将有助于未来的读者。
建造:
Windows 10(64 位)Minicoda(使用 python 3.9.4)(pkgs 来自 conda-forge 频道)pyqt 5.12.3
我的场景:
我正在为一些嵌入式工作构建一个 GUI 应用程序。我有两台用于开发的机器(相同的操作系统和架构),一台的互联网连接为零。打包我的环境并在离线机器上安装后,我遇到了你得到的错误。
解决方案:
在您的 conda 环境中找到 qt.conf 文件。对我来说:C:\Users\"name"\miniconda3\envs\"env_name"\qt.conf
确保路径正确。我需要更新“名称”,因为这是旧机器遗留下来的。
希望这可以帮助某人。
我在 Windows 10(VS2019)中运行 QT5 应用程序时遇到了同样的问题。我的错误是
..\Debug\Qt5Cored.dll 模块:5.14.1 文件:kernel\qguiapplication.cpp 行:1249
此应用程序无法启动,因为无法初始化 Qt 平台插件。重新安装应用程序可能会解决此问题。
解决方案
由于我使用的是 QT msvc2017,因此我将插件文件夹从“C:\Qt\Qt5.14.1\5.14.1\msvc2017\plugins”位置复制到二进制位置
有效。
然后检查 Visual Studio 输出窗口并识别从插件文件夹加载的 dll 并删除不需要的 dll
将 QT_PLUGIN_PATH
环境变量设置为 <...>/plugins
目录也对我有用。
Pycharm 尝试运行 Matplot 时出现错误。对我有用的解决方案是将 Anaconda3\Library\plugins 目录(例如:c:\Program files\Anaconda3\Library\plugins)设置为环境变量“QT_PLUGIN_PATH”。要进行设置,您应该转到控制面板/系统/高级系统设置/环境变量。
主要讲Windows平台
尝试使用 vcpkg
安装的 Qt
库调试应用程序构建时遇到同样的问题,而我的应用程序使用 cmake
构建。在找到解决方案之前遇到了几个小时的麻烦。最简单的方法是执行以下操作:
在您的构建文件夹中,找到最终可执行文件所在的文件夹。
在该文件夹中,您会找到一些 Qt 库,例如 Qt6Core.dll。
注意库文件名中是否有d后缀,即Qt6Cored.dll而不是Qt6Core.dll
在 vcpkg 文件夹中,您有 2 个选项 ./installed/x64-windows/Qt6/plugins/platforms ./installed/x64-windows/debug/Qt6/plugins/platforms
./installed/x64-windows/Qt6/plugins/platforms
./installed/x64-windows/debug/Qt6/plugins/platforms
如果存在 d 后缀,请将 ../debug/.. 文件夹(否则为另一个)的内容复制到您的可执行文件和 Qt 库所在的同一文件夹中的平台文件夹中(如果没有这样的文件夹,自行创建)。
你可以以某种方式自动化这个过程。把这个任务留给你。如果我自己这样做,将更新答案。
编辑
如果您使用的是 CMakeLists
,您可能想尝试一下。将以下内容添加到您应用的 CMakeLists.txt
# 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()
不定期副业成功案例分享