问题描述
我们之前进行过讨论。
在搜索.props文件数小时之后,.prop和.targets中的所有$(VCTargetsPath)都被删除,但是Visual Studio仍然可以正确识别此宏/变量。
通过修改Microsoft.Cpp.ToolsetLocation.props,可以修改$(VCTargetsPath),因此VS无法再创建新项目。
那么,此宏的确切定义在哪里?
我相信此宏不会,也不应进行硬编码。
解决方法
在哪里定义宏$(VCTargetsPath)?
实际上,VCTargetsPath
属性是在 MSBuild 文件夹下的MSBuild系统props
或targets
文件中定义的({{1 }}。并且文件是嵌套的并且彼此相关。 因此,各个属性的值在逐级文件中相互引用,C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild
的值也不例外。
================================================ =========================
MSBuild 实际上等效于软编码。安装 MSBuild 后,它会以一堆dll以及各种已建立的VCTargetsPath
和props
文件的形式存在。您可以在targets
或props
文件中以各种方式修改其属性或扩展其功能。 MSBuild本身是open source build tool。 它没有您想像的那么不变。
================================================ =========================
正如您所说,targets
实际上是在名为VCTargetsPath
的msbuild道具文件中定义的。
MSBuild 中的各种Microsoft.Cpp.ToolsetLocation.props
和targets
文件只是嵌套和相互关联的。 props
设置为VCTargetsPath
属性的值,而_VCTargetsPathForToolset
在另一个关联的_VCTargetsPathForToolset
或targets
文件中定义。
通常,使用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)然后重建您的项目,您会看到以下内容:
它是 MSBuild 系统定义的路径。如果轻松更改它,将导致项目无法编译,除非您具有类似于MSBuild的一组自定义系统来构建C ++项目,然后将其放在新路径中,让新路径将覆盖<Target Name="test123" AfterTargets="Build">
<Message Importance="high" Text="$(VCTargetsPath)"></Message>
</Target>
属性。
此外,我很好奇您为什么想找到最低的VCTargetsPath
值。如果您想了解其原理,可以通过上面的答案进行解释。
并且如果要覆盖其值,可以直接创建一个名为VCTargetPath
的环境系统变量,然后将其值设置为新的一个。
重新启动 VS以启用此类新值。比修改VCTargetsPath
文件容易得多。