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

T.W*_*orm 5 c++ msbuild msbuild-task visual-studio

我们之前有过讨论。

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

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

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

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

我相信这个宏不是也不应该被硬编码。

Mr *_*ian 5

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

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

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

MSBuild实际上相当于软编码。一旦安装了MSBuild,它就会以一堆 dll 和各种已建立的文件props的形式存在targetsprops您可以在或文件中以各种方式修改其属性或扩展其功能targets。MSBuild 本身是一个开源构建工具它并不像你想象的那么一成不变。

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

实际上是VCTargetsPath在您所说的 msbuild props 文件中定义的Microsoft.Cpp.ToolsetLocation.props

在此输入图像描述

只是MSBuildtargets中的各种和props文件是嵌套的、相互关联的。被设置为属性的值,而在另一个关联或文件中定义。VCTargetsPath_VCTargetsPathForToolset_VCTargetsPathForToolsettargetsprops

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

而且MSBuild中的文件非常多,如果你想一层层搜索直到找到最终的具体值,可能会显得有点复杂。

另外,是MSBuild用来编译c++项目的VCTargetsPath一些工具的路径。

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>
Run Code Online (Sandbox Code Playgroud)

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

在此输入图像描述

MSBuild系统定义的路径。如果轻易改变的话,会导致项目编译失败,除非你有一套类似MSBuild的自定义系统来构建C++项目,然后放到新的路径下,让新的路径覆盖VCTargetsPath属性。

另外,我很好奇你为什么要找到最低VCTargetPath值。如果你想了解它的原理,上面的答案已经解释了。

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

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