Qt5应用程序部署qwindows.dll搜索路径顺序

时间:2015-11-03 15:50:44

标签: c++ windows qt dll deployment

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

这非常好,也没有任何Qt安装的机器。

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

当我将我的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,就像它应该一样。

现在的问题是,这种行为是否合适? 在搜索其他地方之前,不应该先在应用程序目录中搜索吗? 是否有可能改变这种行为?

2 个答案:

答案 0 :(得分:1)

我找到了一个符合我需要的答案。

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

[Paths]
Plugins=.

这意味着Qt将只搜索插件!在这个文件夹中。 在这个例子中, qwindows.dll 需要在我们习惯的平台上。

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

可以在这里找到一个非常详细的文章:http://www.tripleboot.org/?p=536在“Qt本身加载的DLL a.k.a. plugins:”

部分

答案 1 :(得分:0)

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

它为我工作。