首页 / 资讯中心 / 文章详情

解决工程中同时存在两个版本 Qt 导致 This application failed to start because no Qt platform plugin could be initiali

解决工程中同时存在两个版本 Qt 导致 This application failed to start because no Qt platform plugin could be initiali ★ FEATURED ARTICLE
文章目录1. 情况描述2. 问题定位3. 解决思路3.1. 分开放置 qwindows.dll3.2. 创建 RunXYZ.bat3.3. 修改 main.cpp4. 总结另一篇关于如何打包工程为 EXE 的文章地址如下 VS2026 打包 C 程序生成 EXE借助 Installer Project 扩展工具。在使用 Visual Studio 开发 Qt 界面程序时如果程序还需要调用其他软件 API部署到其他电脑时就会遇到 Qt 平台插件无法初始化的问题。即报错This application failed to start because no Qt platform plugin could be initialized.主要技术描述为一个工程中同时需要存在两个版本 Qt如何解决共存问题1. 情况描述我们假定开发的工程名字为XYZ被调用软件名字为ABC。同时参照如下一个普通的 Qt Windows 应用部署目录通常包含XYZ\ ├── XYZ.exe ├── Qt6Core.dll ├── Qt6Gui.dll ├── Qt6Widgets.dll └── platforms\ └── qwindows.dll其中Qt6Core.dll、Qt6Gui.dll 等是 Qt 运行库platforms\qwindows.dll 是 Qt 平台插件。而我们现在遇到的情况详细描述为开发了XYZ工程此工程是基于 Qt 开发的界面。工程XYZ里调用了基于 Qt 的ABC软件 API。正常部署XYZ时会默认将对应的 Qt 平台插件platforms\qwindows.dll放置在和XYZ.exe同一文件夹。想要正常调用ABC软件就也必须将软件ABC里的 Qt 平台插件platforms\qwindows.dll放置在和XYZ.exe同一文件夹。那么部署目录就如下注意这是无法运行的XYZ\ ├── XYZ.exe ├── Qt6Core.dll ├── Qt6Gui.dll ├── Qt6Widgets.dll └── platforms\ └── qwindows.dll ← 工程 XYZ 的 Qt 插件 └── platforms\ └── qwindows.dll ← 软件 ABC 的 Qt 插件这种情况下两份qwindows.dll文件是不能共存的会产生相互覆盖的问题。同时解释下qwindows.dll是 Qt 在 Windows 平台上的平台插件。它负责让 Qt 与 Windows 窗口系统交互例如创建窗口以及处理鼠标、键盘等系统事件。所以缺少或者调用不正确都会出现This application failed to start because no Qt platform plugin could be initialized.的提示。2. 问题定位至于软件ABC为什么要如此设置这是因为官方的设定要求否则无法运行也就是说暂时无法修改的。那么我们只能选择移动qwindows.dll ← 工程 XYZ 的 Qt 插件。所以需要处理的问题为将所需要的两个不同的qwindows.dll文件都找到将二者部署起来并让程序在合适时间调用合适文件3. 解决思路3.1. 分开放置 qwindows.dll将两份qwindows.dll放在不同文件夹这样才不会相互覆盖且程序才能根据不同路径索引它们。又由于qwindows.dll ← 软件 ABC 的 Qt 插件受限于官方要求无法移动因此暂时只能选择移动qwindows.dll ← 工程 XYZ 的 Qt 插件到一个新建文件夹qt6plugins下。文件结构如下XYZ\ ├── XYZ.exe ├── Qt6Core.dll ├── Qt6Gui.dll ├── Qt6Widgets.dll └── platforms\ └── qwindows.dll ← 软件 ABC 的 Qt 插件 ├── qt6plugins\ │ ├── platforms\ │ │ └── qwindows.dll ← 工程 XYZ 的 Qt 插件3.2. 创建 RunXYZ.bat然后在XYZ.exe同目录下创建RunXYZ.bat并写入如下内容echo off cd /d %~dp0 set QT_QPA_PLATFORM_PLUGIN_PATH%~dp0qt6plugins\platforms start %~dp0XYZ.exe解释下各行命令作用cd /d %~dp0: %~dp0 表示 BAT 文件所在的目录。这一行将当前工作目录切换到该目录便于程序按现有相对路径查找 data 文件。set QT_QPA_PLATFORM_PLUGIN_PATH%~dp0qt6plugins\platforms: 为即将启动的程序设置 Qt 平台插件路径指向 Qt6 的qt6plugins\platforms这是平台插件所在目录不是插件根目录。start %~dp0XYZ.exe: 从 BAT 所在目录启动程序。程序会继承 BAT 设置的环境变量因此 Qt6 在初始化界面时可以尝试从指定位置加载平台插件。这个变量只在该脚本及其启动的进程环境中设置不需要修改 Windows 系统级环境变量。3.3. 修改 main.cppBAT 将QT_QPA_PLATFORM_PLUGIN_PATH传给了整个XYZ进程。如果直接保留该变量后续ABCAPI 的 Qt 组件也可能受到影响。因此你前面的测试方案是在 Qt6 的 QApplication 创建后清除它修改main.cpp成如下内容#includeQApplication#includeQCoreApplication#includeQDirintmain(intargc,char*argv[]){// Qt 6 在构造 QApplication 时初始化图形平台。QApplicationapp(argc,argv);// 清除由 BAT 设置的平台插件路径// 避免后续 ABC API 继续受到这个路径设置的影响。qunsetenv(QT_QPA_PLATFORM_PLUGIN_PATH);// 让 Qt6 在后续运行中也能查找其他插件// 例如 qt6plugins/imageformats 下的图片格式插件。QCoreApplication::addLibraryPath(QDir(QCoreApplication::applicationDirPath()).filePath(qt6plugins));// 创建并显示项目原有的主窗口。// ...returnapp.exec();}修改后重新编译 Release x64并将新生成的XYZ.exe放入部署目录。但这里要注意这是一种针对当前程序的测试方案不是所有双 Qt 程序都通用的保证。并且这段代码会清除同名环境变量如果程序原本需要保留用户配置还需要另外设计恢复方式。4. 总结本方案中通过 BAT 指定 Qt6 平台插件目录后XYZ界面能够在目标电脑上启动。ABCAPI 是否能正确初始化还需要继续验证其依赖、许可证、硬件连接和实际功能。可通过 Visual Studio 的模块窗口检查两份qwindows.dll的实际加载路径。另外This application failed to start because no Qt platform plugin could be initialized不只会由缺少插件或加载了错误版本引起插件自身依赖缺失等情况也可能导致它。
阅读完成 · 觉得有帮助?
咨询建站