在没有安装Qt VS工具的情况下编译Qt/MsBuild格式的项目

8
我在Visual Studio中有许多Qt项目,使用Qt VS Tools提供的new Qt/MsBuild format。在我的开发环境中编译时(我已经安装了Qt VS Tools),一切都能完美运行(从IDE和命令行编译)。
我们有一台专门用于夜间构建的计算机,只安装了编译器和msbuild(没有安装IDE和Qt VS Tools)。
在这样的计算机上编译项目时,我们会收到以下错误信息:

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时,我该如何解决这些错误?
4个回答

14

Tools的创建者提供的一个解决方案是将%LOCALAPPDATA%\QtMsBuild复制到每个项目目录中。但我们谈论的是数百个项目。手动操作,还有更重要的是,将它们作为项目本身的一部分推送并不太优雅。

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

查看Qt项目的.vcxproj文件时,您会找到此片段(创作者提供解决方案的原因):

<PropertyGroup Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">
  <QtMsBuild>$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
</PropertyGroup>
因此,最简单的解决方案(无法安装工具)是将%LOCALAPPDATA\QtMsBuild目录(从已安装工具的系统中)复制到夜间电脑中(在任何共用位置,但我决定保留工具使用的位置),然后设置环境变量:
set QtMsBuild=%LOCALAPPDATA%\QtMsBuild

PS: 不要在变量中添加双引号(至少我遇到过问题,所以VS找不到文件)。

更新9-14-2020

我不确定从哪个版本开始,但使用(至少)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,例如。

3

我在设置中遇到问题。使用$Env:QtToolsPath="$Env:QT_PATH\bin"解决了这个问题。(在某些检查中找不到qmake)。我认为,在使用QtMsBuild v3.3时需要采用此方法。

不确定这些信息是否百分之百准确,但可能会对有所帮助。

如果我要使用QtMsBuild(而不是安装Visual Studio和/或VS插件)来使用MsBuild和Qt,则需要进行以下设置:

示例(PowerShell):

- $Env:PATH="$Env:MSBUILD_PATH;$Env:PATH"
- $Env:QT_PATH="D:\BuildTools\Qt\5.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"

1
我点击了这个并使其工作。
我遵循了 @cbuchart 的建议,但需要做更多/不同的事情。
所以这是我所做的。我复制了 %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 文件,并最终构建(和运行)。


0

我也遇到过同样的问题。也许你需要更新你的 Visual Studio,然后重启电脑...问题解决了。原因是安装了“Qt VS 工具”的最新版本,但 Visual Studio 不支持它。


3
我认为您回答了一个不同的问题。该问题询问如何在未安装Qt VS工具的情况下编译Qt项目。 - cbuchart

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接