宏 $(VCTargetsPath) 到底在哪里定义的?

Where exactly is macro $(VCTargetsPath) defined?

我们之前讨论过。

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 仍然可以正确识别此 macro/variable。

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

那么,这个宏到底定义在哪里?

我认为这个宏不是也不应该被硬编码。

Where exactly is macro $(VCTargetsPath) defined?

其实,VCTargetsPath属性定义在MSBuild系统propstargets文件下MSBuild 文件夹(C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild)。并且文件是嵌套的并且相互关联。 因此,各种属性的值在level-by-level文件中相互引用,VCTargetsPath的值也不例外。

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

MSBuild其实相当于软编码。安装 MSBuild 后,它会以一堆 dll 和各种已建立的 propstargets 文件的形式存在。您可以在 propstargets 文件中以各种方式修改其属性或扩展其功能。 MSBuild 本身是一个 open source build tool并不是你想的那么一成不变

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

VCTargetsPath实际上是在名为Microsoft.Cpp.ToolsetLocation.props的msbuild props文件中定义的。

只是MSBuild中的各个targetsprops文件是相互嵌套和相互关联的。 VCTargetsPath 设置为 _VCTargetsPathForToolset 属性 的值,而 _VCTargetsPathForToolset 在另一个关联的 targetsprops 文件中定义。

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

MSBuild中的文件太多了,如果要一层层查找,直到找到最终的具体值,可能看起来有点复杂。

外,VCTargetsPathMSBuild编译c++项目时使用的一些工具的路径。

VS2019中的默认值为C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild\Microsoft\VC\v160.

您可以在xxx.vcxproj文件中编写一个自定义目标来输出它的值。

1)xxx.vcxproj文件中写入:

<Target Name="test123" AfterTargets="Build">
        <Message Importance="high" Text="$(VCTargetsPath)"></Message>
</Target>

2) 然后重建你的项目,你可以看到这个:

ItMSBuild 系统定义的路径。如果随便更改,会导致项目编译失败,除非你有一套类似MSBuild的self-defined系统来构建C++项目,然后把它在新路径中,让新路径覆盖 VCTargetsPath 属性.

另外,很好奇为什么要找最低的VCTargetPath值。如果你想知道它的原理,上面的答案已经说明了。

如果想覆盖它的值,可以直接创建一个环境系统变量VCTargetsPath,然后将其值设置为一个新值。

重启 VS启用这样的新值。比修改targets文件要容易得多。