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

时间:2019-02-20 14:26:50

标签: c++ visual-studio qt deployment

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

enter image description here

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

Qt的工具叫做windeployqt,它基本上会查找依赖项(Qt)并复制它们。例如:

c:\Qt\Qt5.12.1\bin\windeployqt c:\projects\qt-project\Release --release

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

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

2 个答案:

答案 0 :(得分:0)

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

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

要处理可移植性:

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

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

  • $(Configuration):扩展为当前配置的名称(通常为 Debug Release ,以下为其他配置名称)。现在,windeployqt对于--debug--release参数是区分大小写的,并且配置名称为标题大小写。要使其小写:--$(Configuration.toLower())credits)。此步骤仅用于执行通用命令,可以通过手动放置--debug--release标志来跳过。

使用此命令,完整的构建后命令如下:

"$(QTDIR)\bin\windeployqt.exe" "$(OutDir.TrimEnd('\'))" --$(Configuration.toLower())

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

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

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

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

答案 1 :(得分:0)

如果只想从Visual Studio运行和/或调试应用程序,则不必复制这些dll,可以在Visual Studio中将依赖项路径添加到调试器环境。

您可以在Visual Studio中执行以下操作:

  • 右键单击解决方案资源管理器中的vcxproj文件
  • 从该上下文菜单中单击Properties
  • 在打开的对话框中,导航到Debugging(在左侧面板中)
  • 在右侧窗格中查找Environment,在其中可以使用类似以下内容的内容:

    PATH = $(QTDIR)\ bin; $(PATH)

注意:当您进行编辑时,可以看到';'的一些编码。没问题,您只需要在编辑时小心,就不会错过';'。在任何两条路径之间。

如果项目依赖于更多库,则可以在其中添加更多环境路径,并且不要忘记对所有构建选项(Release / Debug / x64 / x86 / etc)进行编辑,并且可以使用以下命令定义自己的变量:每个外部库的基本路径。

现在回到Qt,在.user文件中定义了QTDIR变量,对于所有构建配置,您将具有以下内容:

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
    <QTDIR>C:\Qt\5.12.1\msvc2017_64</QTDIR>
    <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
    <LocalDebuggerEnvironment>PATH=$(QTDIR)\bin%3b$(PATH)</LocalDebuggerEnvironment>
  </PropertyGroup>

我遇到的一个问题是将QTDIRLocalDebuggerEnvironment进行了交换(我的意思是首先定义了LocalDebuggerEnvironment),并且显然不起作用,因此,如果是这样,只需使用您喜欢的文本(或xml)编辑器手动交换这2个定义,以便在之前定义QTDIR。

因此,我建议使用此方法,而不是在自定义构建步骤中使用windeploy,而是将windeploy用于生成安装程序(或为安装程序准备文件)的脚本。