当我创建一个C ++ Visual Studio项目时,我在MSBuild的项目文件中得到以下内容:
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>true</UseDebugLibraries>
<PlatformToolset>v140</PlatformToolset>
<CharacterSet>Unicode</CharacterSet>
</PropertyGroup>
我不明白这两个部分之间的区别。当我运行以下内容时:
MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32
正在应用哪个?它们组合成一个吗?我不明白&#34; include&#34;之间的区别。 ProjectConfiguration和&#34; condition&#34; PropertyGroup。
答案 0 :(得分:2)
首先,您错过了粘贴重要部分(因此您显示的内容不是有效的msbuild语法):'ProjectConfiguration'是Item,因为它位于ItemGroup内。所以完整的定义实际上是,例如:
<ItemGroup>
<ProjectConfiguration Include="Debug|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
<ProjectConfiguration Include="Release|Win32">
<Configuration>Debug</Configuration>
<Platform>Win32</Platform>
</ProjectConfiguration>
</ItemGroup>
这定义了一个list / array / collection /'无论你想要什么,它都是名为ProjectConfiguration的2个元素。第一个元素是“Debug | Win32”并有2个Metadata项:第一个名为'Configuration',值为'Debug',第二个名为'Platform',值为'Win32'。 ProjectConfiguration项基本上用作告诉构建系统的列表,包括VS中的gui,项目存在哪些配置/平台组合。
Properties在PropertyGroup中定义,只是键/值对。 PropertyGroup上的Condition属性导致其中的属性仅在条件匹配时才被定义。因此,虽然Include和Condition都是xml属性,但它们完全不同的用途:第一个,在Item中使用,将一个元素添加到Item集合,而第二个是条件(顺便提一下,它也可以放在几乎所有其他msbuild上)元素,也是在Item或ItemGroup上),当评估为False时,丢弃内容。
当我运行以下内容时:
MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32
正在应用哪个?它们合二为一了吗?
传递/p
在命令行上定义属性,与PropertyGroup中定义的属性没有区别(此外,在命令行上定义的属性通常会覆盖项目文件中指定的属性)。现在对于ItemGroup,你在命令行上传递的内容没有区别:它仍然包含2个元素,告诉构建系统有哪些组合可用。它确实改变了哪些属性生效。考虑:
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<UseDebugLibraries>true</UseDebugLibraries>
</PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<UseDebugLibraries>false</UseDebugLibraries>
</PropertyGroup>
$()
语法用于扩展属性值,所以如果在命令行上传递/ p:Configuration = Debug; Platform = Win32,那么'$(配置)| $(平台)'=''调试|解析和评估后,Win32'“会扩展为'Debug | Win32'=='Debug | Win32'”,而后者的计算结果为True。因此,第一个PropertyGroup定义生效但不是第二个,因为对于后者,条件不匹配。因此,名为“UseDebugLibraries”的Property获取值“true”。你应该传递/ p:Configuration = Release;而不是Platform = Win32,它会得到值'false'。这最终用于更改执行的编译器/链接器命令,并向其传递一个标志以指示要使用的运行时库。