Qt5 应用程序部署 qwindows.dll 搜索路径顺序
Qt5 application deploy qwindows.dll search path order
我正在用同一文件夹中的所需 DLL 部署我们的应用程序。
在 platforms 文件夹中加上 qwindows.dll。
效果非常好,没有安装任何 Qt 的机器也是如此。
直到昨天,当我将我的 Qt 更新到 5.5.1 时。
现在所有曾经使用 Qt 5.5.0 构建的应用程序都停止工作并显示众所周知的错误:"could not find or load the Qt platform plugin 'windows'".
当我将我的 Qt 文件夹 (C:\Qt) 重命名为其他名称时,一切又恢复正常了。
对 Dependancy Walker 的进一步调查表明,应用程序确实会查看我的 C:\Qt 文件夹以找到平台 dll。但他们找到 newer/different 版本并抛出错误。
GetProcAddress(0xxxx [ADVAPI32.DLL], "SystemFunction036") called from "MSVCR120.DLL" at address 0xxxx and returned 0x00007FFB269C1050.
LoadLibraryW("C:\Qt.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\msvc2013_64\plugins\platforms\qwindows.dll") returned NULL. Error: Die angegebene Prozedur wurde nicht gefunden (127).
现在,如果重命名 C:\Qt 文件夹,应用程序不会在那里找到它,而是像往常一样在 ./platforms/ 中使用 qwindows.dll。
现在的问题是,这种行为是否需要?
在搜索其他地方之前,它不应该先在应用程序目录中搜索吗?
是否有可能改变这种行为?
我找到了解决办法。您需要添加此环境变量并指向 qwindows.dll:
QT_QPA_PLATFORM_PLUGIN_PATH=C:\程序Files\Your_App_Path\platforms
它对我有用。
我找到了适合我需要的答案。
可以将 qt.conf 文件放在与部署的 exe 相同的目录中。在此文件中,您可以像这样指定插件目录:
[Paths]
Plugins=.
这意味着 Qt 将只搜索插件!在这个文件夹中。
在此示例中,qwindows.dll 需要像我们习惯的那样在平台中。
这对我来说非常有效,因为我为每个要部署的应用程序完全分离了 qt dll 和插件。并且已安装的 Qt 版本不再干扰。
可以在此处找到非常详细的说明:http://www.tripleboot.org/?p=536 "DLLs loaded by Qt itself a.k.a. plugins:"
部分
我正在用同一文件夹中的所需 DLL 部署我们的应用程序。 在 platforms 文件夹中加上 qwindows.dll。
效果非常好,没有安装任何 Qt 的机器也是如此。
直到昨天,当我将我的 Qt 更新到 5.5.1 时。 现在所有曾经使用 Qt 5.5.0 构建的应用程序都停止工作并显示众所周知的错误:"could not find or load the Qt platform plugin 'windows'".
当我将我的 Qt 文件夹 (C:\Qt) 重命名为其他名称时,一切又恢复正常了。
对 Dependancy Walker 的进一步调查表明,应用程序确实会查看我的 C:\Qt 文件夹以找到平台 dll。但他们找到 newer/different 版本并抛出错误。
GetProcAddress(0xxxx [ADVAPI32.DLL], "SystemFunction036") called from "MSVCR120.DLL" at address 0xxxx and returned 0x00007FFB269C1050.
LoadLibraryW("C:\Qt.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\msvc2013_64\plugins\platforms\qwindows.dll") returned NULL. Error: Die angegebene Prozedur wurde nicht gefunden (127).
现在,如果重命名 C:\Qt 文件夹,应用程序不会在那里找到它,而是像往常一样在 ./platforms/ 中使用 qwindows.dll。
现在的问题是,这种行为是否需要? 在搜索其他地方之前,它不应该先在应用程序目录中搜索吗? 是否有可能改变这种行为?
我找到了解决办法。您需要添加此环境变量并指向 qwindows.dll: QT_QPA_PLATFORM_PLUGIN_PATH=C:\程序Files\Your_App_Path\platforms
它对我有用。
我找到了适合我需要的答案。
可以将 qt.conf 文件放在与部署的 exe 相同的目录中。在此文件中,您可以像这样指定插件目录:
[Paths]
Plugins=.
这意味着 Qt 将只搜索插件!在这个文件夹中。 在此示例中,qwindows.dll 需要像我们习惯的那样在平台中。
这对我来说非常有效,因为我为每个要部署的应用程序完全分离了 qt dll 和插件。并且已安装的 Qt 版本不再干扰。
可以在此处找到非常详细的说明:http://www.tripleboot.org/?p=536 "DLLs loaded by Qt itself a.k.a. plugins:"
部分