应用程序无法启动,因为它无法找到或加载QT平台插件“windows”

时间:2014-01-21 20:35:19

标签: c++ qt dll platform

我查看了所有与堆栈溢出相关的问题,但没有一个解决方案似乎能帮助我。

我正在使用此设置构建Qt应用程序:

  • Windows 7 Professional x64
  • Visual Studio 2012
  • 使用configure -developer-build -debug-and-release -opensource -nomake examples -nomake tests -platform win32-msvc2012 -no-opengl
  • 构建的Qt 5.2.0
  • Project使用QtSingleApplication(qt-solutions)
  • 应用程序是32位应用程序
  • qmake使用以下命令运行:-makefile -spec win32-msvc2012
  • .pri使用QMAKE_CXX += /D_USING_V110_SDK71_

我可以在我的开发机器上构建和运行我的程序(如上所述);我也可以在dev机器上的Program Files目录下安装和运行包。

当我在Windows Vista计算机上安装并运行时(多台计算机)

  • VC ++ redist 2012 11.0.61030.0已安装
  • VC ++ redist 2010 10.0.40219已安装
  • 加上2005年版本的redist

(在Windows 7的全新安装上也失败)

我明白了:

Application failed to start because it could not find or load the QT platform plugin "windows"

所以我按照说明添加了.platforms /目录,并添加了qwindows.dll(还添加了qminimal.dll和qoffscreen.dll);我还添加了libEGL.dll,libGLESv2.dll(即使我不需要它们,我也不认为)

一旦我添加了qoffscreen.dll,我现在收到其他消息:Available platform plugins are: offscreen

如果我通过Dependency Walker运行,我会列出这个错误:

GetProcAddress(0x76CA0000 [KERNEL32.DLL], "GetCurrentPackageId") called from "MSVCR110.DLL" at address 0x6AC6FDFA and returned NULL. Error: The specified procedure could not be found (127).

然后进一步得到:

GetProcAddress(0x745A0000 [UXTHEME.DLL], "BufferedPaintUnInit") called from "COMCTL32.DLL" at address 0x745FFBF8 and returned 0x745AE18C.
This application failed to start because it could not find or load the Qt platform plugin "windows".

Available platform plugins are: offscreen.

Reinstalling the application may fix this problem.

如何修复此dll问题的任何想法?

13 个答案:

答案 0 :(得分:23)

导致错误是因为程序找不到qwindows.dll

qwindows.dll必须位于名为platforms的文件夹中,以便从可执行文件到dll的路径为platforms/qwindows.dll

虽然这在我的案例中还不够。我还要在main()

的开头添加以下行
QCoreApplication::addLibraryPath("./");

然后一切正常。

答案 1 :(得分:9)

我遇到了这个问题以及我是如何解决的:

  1. 使用了依赖性walker(http://www.dependencywalker.com/)来查看所需dll的确切路径。试试看,因为QtCreator和QT框架都有相同的dll,你必须确定使用的确切数据。 我复制了与应用程序在同一文件夹中所需的所有dll。

  2. 我已经从QT框架/插件中复制了文件夹平台,并将其复制到与应用程序相同的文件夹中。现在,该应用程序还包含plugin / platform /文件夹及其所有dll

  3. 在我的案例中,最重要的一步是在与应用程序相同的文件夹中创建一个名为qt.conf的文件。该文件应包含插件的路径。我的qt.conf文件包含:

    [路径]
    库= .. / LIB / qtcreator
    插件=插件
    进口=进口
    Qml2Imports = QML

答案 2 :(得分:8)

应用程序能够在主机系统上运行,因为Qt bin路径位于系统PATH变量中。

有一个标准的Qt工具可以在Windows windeployqt上部署Qt应用程序,以便能够在没有安装Qt的目标计算机上运行该应用程序。

该工具负责Qt DLL依赖关系,制作platforms\qwindows.dll的副本,并且它还创建了一个使用 Dependency Walker 无法检测到的库的副本,因为图像插件和一些其他DLL在运行时加载。

您甚至不需要在您的环境bin中拥有Qt PATH文件夹。最简单的部署:

  • 将构建的exe二进制文件复制到新文件夹
  • 在该文件夹中打开cmd控制台
  • 使用完整路径调用windeployqt(如果它不在系统PATH中)并提供您的可执行文件,例如:
    c:\Qt\Qt5.2.1\5.2.1\msvc2010_opengl\bin\windeployqt.exe application.exe
    

因此,您在该文件夹中拥有运行应用程序所需的所有Qt DLL。

工具windeployqt有多种选择。它还可以处理qml相关文件的部署。

当然,您也可能遇到MSVC可再发行组件的问题,但这些问题应单独部署并在每个系统上安装一次。

如果使用它们,则只能手动复制某些第三方库,例如OpenSSL。

答案 3 :(得分:5)

我有同样的问题“应用程序无法启动,因为它无法找到或加载QT平台插件”windows“ 我通过将下面的文件复制到app.exe(我的应用程序可执行文件)文件夹

来修复此问题

Qt5Core.dll,Qt5Gui.dll,Qt5Widgets.dll以及带有qminimal.dll,qoffscreen.dll,qwindows.dll的“平台”目录。

enter image description here

enter image description here

我希望这能帮到某人

答案 4 :(得分:3)

请注意,如果您应用中编码的qwindows.dll的搜索路径包含您安装Qt的路径,则会导致此问题 。请考虑以下情形:

  1. 我将Qt安装到c:\Qt\...
  2. 我开发了一个应用并在其他地方正确部署。
  3. 它可以在任何计算机上正常运行,因为它在子目录中包含qwindows.dll
  4. 我将本地Qt升级到新版本。
  5. 我尝试再次运行我的应用程序。
  6. 结果是此错误,因为qwindows.dll中的c:\Qt\...之前找到在其本地目录中的,并且与它不兼容。非常烦人。

    解决方案是将文件qt.conf放在与exe文件相同的目录中。我不知道如何避免这种情况。如果您使用工具windeployqt.exe来部署您的应用,那么您有一个名为platforms的子目录,那么这就足够了:

    [Paths]
    Plugins=.
    

答案 5 :(得分:2)

对于将来遇到这个问题的人 - 我有一个肮脏的小黑客,为我工作。请自担风险。

按照初始部署中的所有步骤(快速和脏)[http://wiki.qt.io/Deploy_an_Application_on_Windows]

  1. 关闭Qt Creator。
  2. 将以下内容复制到C:\ Deployment \ MyApp.exe的发行版中。来自的所有.dll文件 C:\ Qt \ 5.2.1 \ mingw48_32 \ bin \来自的所有文件夹 C:\ Qt的\ 5.2.1 \ mingw48_32 \插件\
  3. (如果您使用的是QML)C:\ Qt \ 5.2.1 \ mingw48_32 \ qml \ Rename C:\ Qt \中的所有文件夹到C:\ QtHidden \(这会将您的PC变成干净的环境,就像一个没有安装Qt的人。)
  4. 启动C:\ Deployment \ MyApp.exe。
  5. 现在是黑客 -

    1. 复制文件夹以确保安全
    2. 如果您的文件位于/ cat / Deployment中,请转至/ cat
    3. 现在,在.exe仍在运行时删除Deployment文件夹。
    4. 它会告诉您它无法删除某些文件,因此请说Skip(或全部跳过)
    5. 您剩下的是您的.exe实际使用且无法删除的所有.dll文件的列表:所有文件的列表以及您需要保留的文件。
    6. 您现在可以关闭.exe文件。 要检查它是否正常部署,请进入安装它的文件夹,例如C:/ Qt并将其重命名为C:/ NotQt(基本上使Qt对系统不可见)。 如果它现在有效,它将经常部署在其他系统上。

答案 6 :(得分:1)

我解决了我的问题,虽然我不确定区别是什么:

我将qt目录中的每个dll复制到我的应用程序目录的./和./platforms中。

应用程序已经超过了错误,但随后崩溃了。

VERSION.dll导致崩溃(在依赖者walker中注明),所以我从两个地方删除了它。

应用程序已启动,因此我系统地删除了所有不需要的dll。

这让我回到原来的状态。

然后我卸载了我的应用程序并重新安装(只剩下./platforms/qwindows.dll文件),应用程序正常工作。

所以我可以假设我在平台目录中有一个不正确版本的qwindows.dll。

答案 7 :(得分:1)

我遇到了同样的问题: 1.它可以在VS2010中运行; 2.它可以在包含文件的文件夹中运行: APP.EXE \平台\ qwindows.dll ...

  1. 但它无法在与开发者相同的干净机器上加载qwindows。
  2. 只需将平台文件夹移动到插件即可解决: APP.EXE 插件\平台\ qwindows.dll


    plus:qwindows.dll可以重命名为任何你喜欢的插件interfce查询: qt_plugin_query_metadata()

答案 8 :(得分:1)

它缺少qwindows.dll,它通常应该在平台上,除非你添加:

QCoreApplication::addLibraryPath("<yourpath>");

如果你不这样做,并将qwindows.dll放在其他地方,Qt将在你的PATH中搜索DLL,这可能需要很长时间(10s - 几分钟)!

答案 9 :(得分:1)

对我来说,我needed to set QT_QPA_PLATFORM_PLUGIN_PATH到平台目录,然后就可以了。

对于它的价值,这个解决方案也是mentioned on GitHub

答案 10 :(得分:0)

尝试了以上所有内容 - 结果对我来说,这只是因为我在Qt文件夹中没有主apps个dll

  • Qt5Core.dll
  • Qt5Widgets.dll

答案 11 :(得分:0)

我通过将qt.conf放在应用程序的exe文件夹中来解决此问题:

[Paths]
Prefix=C:/Qt/Qt5.11.2/5.11.2/msvc2017

位置:

  1. 我已经在C:\Qt\Qt5.11.2\5.11.2\msvc2017中安装了自定义Qt工具包
  2. qt.conf通过Prefix属性通知应用程序定制工具包的位置。请注意使用正斜杠而不是反斜杠(!)
  3. 而且,我的PATH环境变量中还包含了Qt工具箱的bin文件夹

Prefix文件中定义qt.conf时,它可以在应用启动时找到qwindows.dll平台插件。

答案 12 :(得分:0)

您需要向系统添加环境变量QT_QPA_PLATFORM_PLUGIN_PATH,该环境变量指向QT插件中的platforms目录。就我而言,我正在使用Anaconda和PySide2。因此,我的目录路径为C:\ProgramData\Anaconda3\envs\cv\Lib\site-packages\PySide2\plugins。这解决了每个QT项目的问题。否则,您将复制平台目录到每个QT项目。