2

每次在 Visual Studio 中首次构建新的 Qt 项目时,即使安装了 VS 工具,我也必须复制一些与 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

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

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

4

2 回答 2

4

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

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

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

处理可移植性:

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

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

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

有了这个,完整的构建后命令如下:

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

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

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

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

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

更新

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

在此处输入图像描述

于 2019-02-20T14:26:50.173 回答
1

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

您可以像这样在 Visual Studio 中执行此操作:

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

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

注意:当您编辑回来时,您可以看到“;”的一些编码 这不是问题,您只需要在编辑时小心,以免错过';' 在任意 2 条路径之间。

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

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

  <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 ) 编辑器,以便在之前定义 QTDIR。

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

于 2019-02-20T14:49:28.693 回答