windeployqt.exe 将 Qt 目录存放在哪里?

Posted

技术标签:

【中文标题】windeployqt.exe 将 Qt 目录存放在哪里?【英文标题】:Where does windeployqt.exe store the Qt directory? 【发布时间】:2019-09-19 22:52:17 【问题描述】:

当尝试运行 windeployqt.exe 时,它如何知道在哪里寻找 Qt 库?

我使用的是 Windows、Qt 5.3、msvc2013_opengl。


我有以下设置:

Qt 首先被提取到C:/PathA/Qt/5.3。它在那里工作得很好。 我把Qt复制到C:/PathB/Qt/5.3 然后我将文件夹 C:/PathA/ 重命名为 C:/PathC/ 以“隐藏”旧位置。

当运行C:/PathB/Qt/5.3/.../windeployqt.exe 时,它会抱怨它无法读取文件C:/PathA/.../QtPrintSupport.dll - 当然,因为该文件不再存在......

我试过了:

在 shell 中本地覆盖环境变量。 从环境变量中删除所有出现的PathA 并重新启动。 在注册表中搜索PathA。 检查了PathBPathC 中的qt.conf - 两者都包含相对路径。 查了windeployqt的源码-好像叫qmake -query。 同时调用 qmake.exe -query - 它们按预期返回 PathBPathC。 更改了两个 qtenv2.bat 中的路径。

不过,windeployqt 仍然坚持搜索 C:/PathA - 那么它从哪里获得该值?


PS:我知道我可以尝试卸载所有版本的 Qt,摆脱所有与 Qt 相关的内容并从头开始重新安装。然而,这不是我感兴趣的。我有兴趣允许多个版本的 Qt 彼此相邻安装并控制使用哪一个(使用 CMake 和 Visual Studio)。


编辑: 与this question 相比,我没有使用QtCreator,这个问题的范围不是“如何在使用QtCreator 时安装多个Qt 版本?”。问题具体是“windeployqt.exe 在哪里获得 Qt 库的路径?”

【问题讨论】:

这是一个 XY 问题。不要试图强迫工具以不同于其设计方式的方式工作。您已经可以并排安装多个版本的 Qt,这一切都记录在这里:doc.qt.io/qtcreator/creator-project-qmake.html Installing multiple versions of Qt library的可能重复 我既不使用 QtCreator 也不使用 qmake。我使用 CMake、Visual Studio 和 windeployqt。当调用 windeployqt 时,它在某处存储了不存在的路径...... 【参考方案1】:

引用this page:

windeployqt 将 .exe 文件或包含 .exe 文件的目录作为参数,并扫描可执行文件的依赖项...然后将识别的依赖项复制到可执行文件的目录中。 Qt5Core.dll 中硬编码的本地路径被替换为相对路径。

因此,您可能正在 Qt5Core.dll 中寻找这些硬编码路径,您可以使用十六进制编辑器来查找“qt_prfxpat”。

【讨论】:

我找到了硬编码的路径并对其进行了编辑,但 windeployqt 之后仍然使用相同的路径。看起来这个文档只说,windeployqt 将复制 Qt5Core 并在那里编辑存储的路径。但是你的回答让我走上了正轨……【参考方案2】:

据我所知,顺序是这样的:

如果在 PATH 的某个目录中找到带有 qt.conf 文件的 qmake.exewindeployqt 使用 <path to qmake&qt.conf>/<prefix in qt.conf>/bin 否则,如果在与windeployqt.exe 相同的目录中找到qmake.exe,则使用qmake.exe 中的硬编码路径qt_binspath 否则,如果在 PATH 中找到 qmake.exe,则使用那里的 qt_binspath else windeployqt 失败并显示“无法查询 qmake:CreateProcessW 失败”

感谢 Pedro 对硬编码值的提示以及使用十六进制编辑器的建议。

【讨论】:

以上是关于windeployqt.exe 将 Qt 目录存放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

Qt工程打包发布

Qt官方开发环境生成的exe发布方式--使用windeployqt

QT程序发布windeployqt.exe

Qt 程序发布

QT打包动态库

Qt 教你使用windeployqt工具来进行Qt的打包发布