【问题标题】:Qt5 application deploy qwindows.dll search path orderQt5应用部署qwindows.dll搜索路径顺序
【发布时间】:2023-03-13 23:34:01
【问题描述】:

我正在将我们的应用程序与所需的 DLL 部署在同一个文件夹中。 加上平台文件夹中的 qwindows.dll。

这真的很棒,没有任何 Qt 安装的机器也是如此。

直到昨天,当我将我的 Qt 更新到 5.5.1 时。 现在,曾经使用 Qt 5.5.0 构建的所有应用程序都停止工作并显示众所周知的错误:“无法找到或加载 Qt 平台插件 'windows'”。

当我将我的 Qt 文件夹 (C:\Qt) 重命名为其他名称时,一切都恢复正常了。

对 Dependancy Walker 的进一步调查表明,应用程序确实在我的 C:\Qt 文件夹中查找平台 dll。但他们发现更新/不同的版本并抛出错误。

GetProcAddress(0xxxx [ADVAPI32.DLL], "SystemFunction036") called from "MSVCR120.DLL" at address 0xxxx and returned 0x00007FFB269C1050.
LoadLibraryW("C:\Qt\5.5\msvc2013_64\plugins\platforms\qwindows.dll") called from "QT5CORE.DLL" at address 0xxxx.
Loaded "QWINDOWS.DLL" at address 0xxxx.  Successfully hooked module.
Loaded "WINMM.DLL" at address 0xxxx.  Successfully hooked module.
Loaded "OLEAUT32.DLL" at address 0xxxx.  Successfully hooked module.
Loaded "WINMMBASE.DLL" at address 0xxxx.  Successfully hooked module.
Loaded "DEVOBJ.DLL" at address 0xxxx.  Successfully hooked module.
Unloaded "QWINDOWS.DLL" at address 0xxxx.
Unloaded "OLEAUT32.DLL" at address 0xxxx.
Unloaded "WINMM.DLL" at address 0xxxx.
Unloaded "WINMMBASE.DLL" at address 0xxxx.
Unloaded "DEVOBJ.DLL" at address 0xxxx.
LoadLibraryW("C:\Qt\5.5\msvc2013_64\plugins\platforms\qwindows.dll") returned NULL. Error: Die angegebene Prozedur wurde nicht gefunden (127).

现在,如果重命名 C:\Qt 文件夹,应用程序将无法在其中找到它,并像往常一样使用 ./platforms/ 中的 qwindows.dll。

现在的问题是,是否需要这种行为? 它不应该先在应用程序目录中搜索,然后再搜索其他地方吗? 有没有可能改变这种行为?

【问题讨论】:

  • 如何使用 DependencyWalker 获得该输出?据我所知,plugins 中的库是由 Qt 在运行时加载的。我试图重现您的问题,但在我的应用程序中,我在 Dependency Walker 中找不到对 qwindows.dll 的依赖项(但该应用程序具有并且需要 qwindows.dll)。你有 qt.conf 吗?
  • DependancyWalker 具有“分析”模式,它会吐出非常详细的加载日志。

标签: c++ windows qt dll deployment


【解决方案1】:

我找到了适合我需要的答案。

可以将 qt.conf 文件放在与部署的 exe 相同的目录中。在此文件中,您可以像这样指定插件目录:

[Paths]
Plugins=.

这意味着 Qt 将只搜索插件!在这个文件夹中。 在此示例中,qwindows.dll 需要像我们习惯的那样位于平台/中。

这对我来说非常有效,因为对于我要部署的每个应用程序,我都将 qt dll 和插件完全分开。并且已安装的 Qt 版本不再干扰。

可以在此处找到非常详细的文章:http://www.tripleboot.org/?p=536 在“Qt 本身加载的 DLL 也称为插件:”部分中:

【讨论】:

    【解决方案2】:

    我找到了解决方案。您需要添加此环境变量并指向 qwindows.dll: QT_QPA_PLATFORM_PLUGIN_PATH=C:\Program Files\Your_App_Path\platforms

    它对我有用。

    【讨论】:

    • 这并没有真正的帮助。想象一下,我想在同一台机器上部署多个具有不同 qt 版本的应用程序。
    • 我知道这不是最好的解决方案。试试这个解决方案:stackoverflow.com/questions/29567972/…我没试过..
    猜你喜欢
    • 1970-01-01
    • 2013-08-24
    • 1970-01-01
    • 1970-01-01
    • 2016-03-16
    • 2011-01-20
    • 1970-01-01
    • 2019-01-06
    • 1970-01-01
    相关资源
    最近更新 更多