在未安装 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 版本。要解决这个问题,你可以
- 从安装了工具的计算机复制注册表条目,位于
HKCU\SOFTWARE\Digia\Versions
。
- 如果您将依赖单个 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
文件并最终构建(和 运行)。
我在 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 版本。要解决这个问题,你可以
- 从安装了工具的计算机复制注册表条目,位于
HKCU\SOFTWARE\Digia\Versions
。 - 如果您将依赖单个 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
文件并最终构建(和 运行)。