我们之前讨论过。
搜索.props文件数小时后,.prop和.targets中的所有$(VCTargetsPath)都会被删除,但是Visual仍然可以正确识别这个宏/变量。
通过修改Microsoft.Cpp.ToolsetLocation.props,可以修改$(VCTargetsPath),因此VS不能再创建新项目。
那么,这个宏究竟是在哪里定义的呢?
我认为这个宏不是也不应该硬编码。
发布于 2020-08-25 08:31:51
宏$(VCTargetsPath)究竟是在哪里定义的?
实际上是,VCTargetsPath
属性是在 MSBuild 文件夹(C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild
)下的MSBuild system props
或targets
文件中定义的。而且这些文件是嵌套的,并且是相互关联的。因此,,各个属性值在逐级文件中相互引用,VCTargetsPath
的值也不例外。
==========================================================================
MSBuild实际上等同于软编码。一旦安装了MSBuild,它就以一堆dll和各种已建立的props
和targets
文件的形式存在。您可以在props
或targets
文件中以各种方式修改其属性或扩展其功能。MSBuild本身就是一个开源构建工具。它并不像你想的那样不可改变。--
==========================================================================
正如您所说,VCTargetsPath
实际上是在名为Microsoft.Cpp.ToolsetLocation.props
的msbuild文件中定义的。
只是targets
和props
文件在MSBuild中是嵌套和相互关联的。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
文件容易得多。
https://stackoverflow.com/questions/63540048
复制相似问题