如何将 Qt 的 Windeployqt 集成为 Visual Studio 构建工作流程的一部分?

cbu*_*art 2 deployment qt visual-studio qt5 windeployqt

每次在 Visual Studio 中首次构建新的 Qt 项目时,即使安装了 VS Tools,我也必须复制一些与 Qt 相关的二进制文件(Qt5Core.dll、平台文件...)。否则,当从 Visual Studio 运行时,Qt5Core.dll(或调试)可以正确找到,但找不到平台 DLL:

在此输入图像描述

显然,当从 IDE 外部运行时,例如在自动化构建的单元测试期间,它也会失败。

Qt 有一个工具可以执行此操作,称为windeployqt,它基本上查找依赖项 (Qt) 并复制它们。例如:

c:\Qt\Qt5.12.1\bin\windeployqt c:\projects\qt-project\Release --release
Run Code Online (Sandbox Code Playgroud)

将分析其中的可执行文件c:\projects\qt-project\Release并将所需的 DLL、插件、翻译和其他相关二进制文件复制到该位置。

我对如何集成windeployqt到 Visual Studio 的构建工作流程感兴趣,因此这个过程是自动的(即使在不同的计算机上签出)。

cbu*_*art 5

显然,您可以创建一个批处理文件并执行它,但请记住,您必须在编译项目执行此操作,因为该工具将查看可执行文件。此外,您还必须处理构建路径和 Qt 安装目录位置,以便使其可以跨系统移植。

(有关此问题的更新,请参阅本答案的末尾)

更方便的方法是在项目中配置windeployqt为构建后事件(项目属性 > 构建事件 > 构建后事件)。我在这里记录了这一点,因为我找不到任何明确的参考资料,并且我花了一段时间才弄清楚。

处理可移植性:

  • $(QTDIR):此变量扩展到当前 Qt 版本的安装路径(当然,我假设它是一个 Qt 项目,并且安装了Qt VS Tools )。用它来定位windeployqt(在 下$(QTDIR)\bin\)。

  • $(OutDir):扩展到可执行文件的构建目录。像往常一样,引用它来处理带有空格的路径。这里的问题是$(OutDir)通常以反斜杠 ( \) 结尾,因此当"$(OutDir)"展开时,它将创建一个会被错误解释的转义字符\"。为了修复它,您可以修剪前导斜线:("$(OutDir.TrimEnd('\'))"制作人员)。

  • $(Configuration):扩展为当前配置的名称(通常是 DebugRelease,请阅读下面的其他配置名称)。现在,或参数windeployqt区分大小写,并且配置名称采用标题大小写。将其小写:(学分。这一步只是为了有一个通用命令,可以通过手动添加或标志来跳过。--debug--release--$(Configuration.toLower())--debug--release

这样,完整的构建后命令如下:

"$(QTDIR)\bin\windeployqt.exe" "$(OutDir.TrimEnd('\'))" --$(Configuration.toLower())
Run Code Online (Sandbox Code Playgroud)

该命令可以在项目的所有平台和配置中统一应用。

现在,如果您有其他配置,ReleaseDebug可以:

  • --debug通过添加或相应地修改命令--release,或者

  • 为“基于调试的配置”和“基于发布的配置”创建自定义属性页,并将变量(例如BaseConfiguration)设置为DebugRelease,然后在命令中使用这个新变量。

更新

由于 Qt VS Tools 的几个版本之前(不确定是哪个,但至少是 2.7.1),部署工具可以直接从项目的属性表添加到构建链中:

在此输入图像描述