宏$VCTargetsPath到底在哪里定义?

问题描述

我们之前进行过讨论。

https://social.msdn.microsoft.com/Forums/vstudio/en-US/e04e7791-c0c4-4598-b900-310878f5af45/how-can-i-locate-and-change-the-vctargetspath-variable?forum=msbuild

搜索.props文件数小时之后,.prop和.targets中的所有$(VCTargetsPath)都被删除,但是Visual Studio仍然可以正确识别此宏/变量。

通过修改Microsoft.Cpp.ToolsetLocation.props,可以修改$(VCTargetsPath),因此VS无法再创建新项目。

那么,此宏的确切定义在哪里?

我相信此宏不会,也不应进行硬编码。

解决方法

在哪里定义宏$(VCTargetsPath)?

实际上VCTargetsPath属性是在 MSBuild 文件夹下的MSBuild系统propstargets文件中定义的({{1 }}。并且文件是嵌套的并且彼此相关。 因此,各个属性的值在逐级文件中相互引用,C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild的值也不例外。

================================================ =========================

MSBuild 实际上等效于软编码。安装 MSBuild 后,它会以一堆dll以及各种已建立的VCTargetsPathprops文件的形式存在。您可以在targetsprops文件中以各种方式修改其属性或扩展其功能。 MSBuild本身是open source build tool它没有您想像的那么不变。

================================================ =========================

正如您所说,targets实际上是在名为VCTargetsPath的msbuild道具文件中定义的。

enter image description here

MSBuild 中的各种Microsoft.Cpp.ToolsetLocation.propstargets文件只是嵌套和相互关联的。 props设置为VCTargetsPath属性的值,而_VCTargetsPathForToolset在另一个关联的_VCTargetsPathForToolsettargets文件中定义。

通常,使用props将另一个文件嵌入当前的<import projects="xxxx\xxx.props or targets" />targets文件中。

而且 MSBuild 中的文件太多,因此如果您要逐层搜索直到找到最终的特定值,这似乎有点复杂。 / p>

此外props MSBuild 用来编译c ++项目的一些工具的路径。

VS2019 中的默认值为VCTargetsPath

您可以在C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160文件中写入自定义目标,以输出其值。

1)将其写到xxx.vcxproj文件中:

xxx.vcxproj

2)然后重建您的项目,您会看到以下内容:

enter image description here

MSBuild 系统定义的路径。如果轻松更改它,将导致项目无法编译,除非您具有类似于MSBuild的一组自定义系统来构建C ++项目,然后将其放在新路径中,让新路径将覆盖<Target Name="test123" AfterTargets="Build"> <Message Importance="high" Text="$(VCTargetsPath)"></Message> </Target> 属性。

此外,我很好奇您为什么想找到最低的VCTargetsPath值。如果您想了解其原理,可以通过上面的答案进行解释。

并且如果要覆盖其值,可以直接创建一个名为VCTargetPath环境系统变量,然后将其值设置为新的一个。

重新启动 VS以启用此类新值。比修改VCTargetsPath文件容易得多。