在未安装 Qt VS Tools 的情况下以 Qt/MsBuild 格式编译 Qt 项目

Compiling Qt projects in Qt/MsBuild format without Qt VS Tools installed

我在 Visual Studio 中有很多 Qt 项目,使用的是 Qt VS Tools 提供的 new Qt/MsBuild format。在我的开发环境中编译时,我安装了 Qt VS 工具,一切正常(从 IDE 和命令行编译)。

我们有一台专用于夜间构建的计算机,其中只有编译器和 msbuild 可用(没有安装 IDE 和 Qt VS 工具)。

在这样的计算机上编译项目时出现错误:

QtMsBuild: could not locate qt.targets, qt.props; project may not build correctly.

后接几行如

e:********\Preferences.h(4): fatal error C1083: Cannot open include file: 'ui_Preferences.h': No such file or directory

(项目包含 Preferences.ui)。

没有安装Qt VS Tools时如何解决此类错误?

工具创建者提供的一种解决方案是将 %LOCALAPPDATA%\QtMsBuild 复制到每个项目目录中。但我们正在谈论数百个项目。手动做,更多的是,将它们作为项目本身的一部分推送,听起来不是很优雅。

一个选项是添加一个预构建步骤,将其从公共位置复制到每个项目中(并向每个 .gitignore 文件添加 **/QtMsBuild 行)。同样,看起来工作量太大了。

当查看 Qt 项目的 .vcxproj 文件时,您会发现这个片段(创建者提供解决方案的原因):

<PropertyGroup Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">
  <QtMsBuild>$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
</PropertyGroup>

因此,最简单的解决方案(无法安装工具)是将 %LOCALAPPDATA\QtMsBuild 目录(从安装了工具的系统)复制到夜间计算机(在任何公共位置,但我决定保留工具使用的位置)然后设置环境变量:

set QtMsBuild=%LOCALAPPDATA%\QtMsBuild

PS: 不要给变量加上双引号(至少我用它们有问题,所以 VS 找不到文件)。

2020 年 9 月 14 日更新

我不确定它是从哪个版本开始的,但是使用(至少)v2.5.2 Qt VS Tools 创建的 Qt 项目无法编译,表明尚未设置 Qt 版本。要解决这个问题,你可以

  1. 从安装了工具的计算机复制注册表条目,位于 HKCU\SOFTWARE\Digia\Versions
  2. 如果您将依赖单个 Qt 版本(但可能会为所有项目全局更新),您可以跳过注册表,只需将所有项目的 Qt 版本设置为 $(DefaultQtVersion)(与使用的相同在过去的项目格式中)并定义一个指向版本目录的环境变量:例如set DefaultQtVersion=c:\Qt\Qt_5_15_0\Win32

我也收到了。也许您需要更新 visual studio 然后重新启动计算机... 问题解决了。原因:安装 'qt vs tools' 最新版本但 visual studio 不支持。

我在设置时遇到问题 $Env:QtToolsPath="$Env:QT_PATH\bin" 解决了问题。 (它没有找到 qmake 进行一些检查)。我认为这在使用 QtMsBuild v3.3

时是必需的

不确定此信息是否 100% 正确,但可能对某些人有所帮助。

对于使用 QtMsBuild 的 Qt 使用 MsBuild(不安装 Visual Studio and/or VS 插件),我需要设置:

示例(PowerShell):

- $Env:PATH="$Env:MSBUILD_PATH;$Env:PATH"
- $Env:QT_PATH="D:\BuildTools\Qt.15.1\msvc2019_64"
- $Env:QtMsBuild="D:\BuildTools\Qt\QtMsBuild303" #303 Against visual studio project version
- $Env:QtToolsPath="$Env:QT_PATH\bin" #Support QtMSBuild , At desktop is done by the plug in
- $Env:PATH="$Env:QtMsBuild;$Env:PATH"
- $Env:PATH="$Env:QT_PATH\bin;$Env:PATH"

我点击了它,它开始工作了。

我听从了@cbuchart 的建议;但需要做一点 more/different.

这就是我所做的。我将 %LOCALAPPDATA%\QtMsBuild 复制到我的仓库中。然后我用文本编辑器编辑了我的 .vcxproj。我调整了看起来像这样的行:

<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>

成为:

<QtMsBuild Condition="'$(QtMsBuild)'=='' OR !Exists('$(QtMsBuild)\qt.targets')">$(MSBuildProjectDirectory)\..\QtMsBuild</QtMsBuild>

根据您的项目与复制的 QtMsBuild 目录的相对位置,您可能需要对此进行调整。在我的例子中,.vcxproj 位于包含我复制的 QtMsBuild 目录的目录的一级目录中。

接下来我在 QtMsBuild/Qt.props 文件中添加了以下内容:

<PropertyGroup>
   <DefaultQtVersion>$(MSBuildThisFileDirectory)\..\Qt5.15.0\msvc2019_64</DefaultQtVersion>
   <QtToolsPath>$(DefaultQtVersion)\bin</QtToolsPath>
</PropertyGroup>

那是在那个文件的开始 Project 标签之后添加的。

正如@cbuchart 提到的,某些事情可能已经改变。我没有做注册表的想法;但添加了这些行。如果需要,我认为可以将它们添加到在 Qt.props 之前导入的不同文件中。

现在这个“Qt5.15.0\msvc2019_64”是什么;您将需要安装了 Qt 的计算机中的工具、包含和库才能构建(如果您的构建需要 运行 可执行文件(即测试),还需要 DLL)。这可能是很多文件,所以如果您知道自己在做什么,可以减少一些文件。将这些放入它自己的子模块或其他东西中可能是有意义的。

之后它应该 uic/moc 文件并最终构建(和 运行)。