我在Visual中有许多Qt项目,使用Qt工具提供的新的Qt/MsBuild格式。在我安装了Qt工具的开发环境中进行编译时,一切都完美无缺(从IDE和命令行编译)。
我们有一台专门用于夜间构建的计算机,其中只有编译器和msbuild可用(没有安装IDE或Qt工具)。
在这样的计算机中编译项目时,我们会得到一个错误:
QtMsBuild:无法定位qt.targets,qt.props;项目可能无法正确构建。
后面跟着几行,例如
E:*\Preferences.h(4):致命错误C1083:无法打开包含文件:'ui_Preferences.h':没有这样的文件或目录
(项目包含Preferences.ui)。
当未安装Qt工具时,如何解决这些错误?
发布于 2018-06-28 11:46:54
工具的创建者提供的一个解决方案是将%LOCALAPPDATA%\QtMsBuild复制到每个项目目录中。但我们要谈的是上百个项目。手工操作,以及更多的操作,将它们作为项目本身的一部分来推送,听起来不太优雅。
一种选择是添加一个预构建步骤,将其从公共位置复制到每个项目中(并将**/QtMsBuild行添加到每个.gitignore文件中)。又一次,看起来工作太多了。
当查看Qt项目的.vcxproj文件时,您会发现这个片段(创建者提供的解决方案的原因):
<PropertyGroup Condition="'$(QtMsBuild)'=='' or !Exists('$(QtMsBuild)\qt.targets')">
<QtMsBuild>$(MSBuildProjectDirectory)\QtMsBuild</QtMsBuild>
</PropertyGroup>因此,最简单的解决方案(不能安装工具)是将%LOCALAPPDATA\QtMsBuild目录(从安装了工具的系统)复制到夜间计算机(在任何常见的地方,但我决定保留工具使用的位置),然后设置一个环境变量:
set QtMsBuild=%LOCALAPPDATA%\QtMsBuildPS:不要在变量中添加双引号(至少我对它们有问题,所以VS找不到文件)。
更新9-14-2020年
我不确定它是在哪个版本上启动的,但是用(至少)v2.5.2QTVS工具创建的Qt项目无法编译,表明没有设置Qt版本。要解决这个问题,你可以
HKCU\SOFTWARE\Digia\Versions。$(DefaultQtVersion) (在过去的项目格式中使用的相同版本),并定义指向版本目录的环境变量:例如,set DefaultQtVersion=c:\Qt\Qt_5_15_0\Win32。发布于 2020-10-21 12:03:25
我在我的案例中遇到了问题,设置$Env:QtToolsPath="$Env:QT_PATH\bin"解决了这个问题。(没有找到qmake做一些检查)。我认为当使用QtMsBuild v3.3时,这是必需的。
不确定这一信息是否100%正确,但可能会帮助某人。
要想在使用MsBuild的Qt中使用QtMsBuild (而不是安装Visual和/或VS插件),我需要设置:
示例(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"发布于 2021-08-19 15:38:16
我撞到了它并让它正常工作。
我听从了@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文件并最终构建(并运行)。
https://stackoverflow.com/questions/51082148
复制相似问题