宏 $(VCTargetsPath) 到底在哪里定义的?
Where exactly is macro $(VCTargetsPath) defined?
我们之前讨论过。
搜索 .props 文件数小时后,.prop 和 .targets 中的所有 $(VCTargetsPath) 都被删除,但 Visual Studio 仍然可以正确识别此 macro/variable。
通过修改 Microsoft.Cpp.ToolsetLocation.props,可以修改 $(VCTargetsPath),因此 VS 无法再创建新项目。
那么,这个宏到底定义在哪里?
我认为这个宏不是也不应该被硬编码。
Where exactly is macro $(VCTargetsPath) defined?
其实,VCTargetsPath
属性定义在MSBuild系统props
或targets
文件下MSBuild 文件夹(C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild
)。并且文件是嵌套的并且相互关联。 因此,各种属性的值在level-by-level文件中相互引用,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 Studio19\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的self-defined系统来构建C++项目,然后把它在新路径中,让新路径覆盖 VCTargetsPath
属性.
另外,很好奇为什么要找最低的VCTargetPath
值。如果你想知道它的原理,上面的答案已经说明了。
和如果想覆盖它的值,可以直接创建一个环境系统变量叫VCTargetsPath
,然后将其值设置为一个新值。
重启 VS启用这样的新值。比修改targets
文件要容易得多。
我们之前讨论过。
搜索 .props 文件数小时后,.prop 和 .targets 中的所有 $(VCTargetsPath) 都被删除,但 Visual Studio 仍然可以正确识别此 macro/variable。
通过修改 Microsoft.Cpp.ToolsetLocation.props,可以修改 $(VCTargetsPath),因此 VS 无法再创建新项目。
那么,这个宏到底定义在哪里?
我认为这个宏不是也不应该被硬编码。
Where exactly is macro $(VCTargetsPath) defined?
其实,VCTargetsPath
属性定义在MSBuild系统props
或targets
文件下MSBuild 文件夹(C:\Program Files (x86)\Microsoft Visual Studio19\Community\MSBuild
)。并且文件是嵌套的并且相互关联。 因此,各种属性的值在level-by-level文件中相互引用,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 Studio19\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的self-defined系统来构建C++项目,然后把它在新路径中,让新路径覆盖 VCTargetsPath
属性.
另外,很好奇为什么要找最低的VCTargetPath
值。如果你想知道它的原理,上面的答案已经说明了。
和如果想覆盖它的值,可以直接创建一个环境系统变量叫VCTargetsPath
,然后将其值设置为一个新值。
重启 VS启用这样的新值。比修改targets
文件要容易得多。