宏 $(VCTargetsPath) 究竟是在哪里定义的?
其实,VCTargetsPath属性定义在MSBuild系统的props或targets文件中MSBuild文件夹下(C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild)。并且文件是嵌套的并且相互关联。 因此,各个属性的值在逐级文件中相互引用,VCTargetsPath的值也不例外。
================================================ =============================
MSBuild 实际上相当于软编码。 MSBuild 安装后,它以一堆 dll 和各种已建立的 props 和 targets 文件的形式存在。您可以在props 或targets 文件中以各种方式修改其属性或扩展其功能。 MSBuild 本身是一个open source build tool。 它并不像你想象的那样一成不变。
================================================ =============================
正如你所说,VCTargetsPath 实际上是在名为 Microsoft.Cpp.ToolsetLocation.props 的 msbuild props 文件中定义的。
只是MSBuild中的各种targets和props文件是嵌套相互关联的。 VCTargetsPath 设置为 _VCTargetsPathForToolset 属性的值,而 _VCTargetsPathForToolset 定义在另一个关联的 targets 或 props 文件中。
一般情况,使用<import projects="xxxx\xxx.props or targets" /> 在当前targets 或props 文件中嵌入另一个文件。
而且MSBuild中的文件太多了,如果你想逐层搜索直到找到最终的具体值,可能看起来有点复杂。
另外,VCTargetsPath是MSBuild用来编译c++项目的一些工具的路径。
VS2019中的默认值为C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Microsoft\VC\v160。
您可以在xxx.vcxproj 文件中编写自定义目标以输出其值。
1) 将其写入xxx.vcxproj 文件:
<Target Name="test123" AfterTargets="Build">
<Message Importance="high" Text="$(VCTargetsPath)"></Message>
</Target>
2) 然后重建你的项目,你可以看到:
It 是 MSBuild 系统定义的路径。如果随便改,会导致项目编译失败,除非你有一套类似MSBuild的自定义系统来构建C++项目,然后放到新的路径下,让新路径覆盖VCTargetsPath 属性。
另外,我很好奇你为什么要找到最低的VCTargetPath值。如果你想知道它的原理,上面的答案就说明了。
并且如果你想覆盖它的值,你可以直接创建一个名为VCTargetsPath的环境系统变量,然后将它的值设置为一个新的值。
重启 VS 以启用这样的新值。这比修改targets 文件要容易得多。