【问题标题】:Where exactly is macro $(VCTargetsPath) defined?宏 $(VCTargetsPath) 究竟在哪里定义?
【发布时间】:2020-08-22 19:02:28
【问题描述】:

我们之前讨论过。

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无法再创建新项目。

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

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

【问题讨论】:

  • “我相信这个宏是并且不应该是硬编码的。” 没有意义。
  • 到目前为止,您的问题的主要目标是什么?您是要查找此类属性还是将其更改为使用其他路径?
  • 我的主要目标是删除 .prop 和 .target 中的所有定义后,$(VCTargetsPath) 仍然存在,我想知道原因,抱歉我的回复晚了。 @Perry Qian-MSFT

标签: c++ visual-studio msbuild msbuild-task


【解决方案1】:

宏 $(VCTargetsPath) 究竟是在哪里定义的?

其实VCTargetsPath属性定义在MSBuild系统的propstargets文件中MSBuild文件夹下(C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild)。并且文件是嵌套的并且相互关联。 因此,各个属性的值在逐级文件中相互引用,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 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) 然后重建你的项目,你可以看到:

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

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

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

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

【讨论】:

  • 谢谢。但是仍然有疑问:删除了所有定义,VS仍然可以识别它没有意义。这是我的操作流程:shrib.com/#SportiveLemur-WAyQ4K在VMWare中试一试,你会觉得不合理。
  • VCTargetsPath是在这些文件下定义的,实际上,微软在创建MSBuild时,已经有了防止VCTargetsPath为空的机制。并且封装在其他不可访问的路径中,默认值为系统值。但要覆盖其值,可以直接在Microsoft.Cpp.ToolsetLocation.props文件中修改。
  • 这有帮助!顺便说一句,这是来自源代码还是来自你在 MSFT 的同事? @Perry Qian-MSFT
猜你喜欢
  • 2022-01-26
  • 2013-08-20
  • 2012-06-29
  • 2017-08-14
  • 1970-01-01
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多