gpt4 book ai didi

c++ - ProjectConfiguration 与 PropertyGroup (MSBuild)

转载 作者:搜寻专家 更新时间:2023-10-31 02:13:23 25 4
gpt4 key购买 nike

当我创建 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

正在应用哪个?它们合二为一了吗?我不明白 ProjectConfiguration 的“include”和 PropertyGroup 的“condition”之间的区别。

最佳答案

首先,您错过了粘贴一个重要部分(因此您显示的是无效的 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>

这定义了一个名为 ProjectConfiguration 的包含 2 个元素的列表/数组/集合/'随便你怎么调用它'。第一个元素是“Debug|Win32”并且有 2 Metadata项目:第一个名为“Configuration”,值为“Debug”,第二个名为“Platform”,值为“Win32”。 ProjectConfiguration Item 基本上用作一个列表,告诉构建系统,包括 VS 中的 gui,项目存在哪些配置/平台组合。

Properties在 PropertyGroup 中定义,只是键/值对。 Condition PropertyGroup 上的属性导致其内部的属性仅在条件匹配时才被定义。因此,虽然 Include 和 Condition 都是 xml 属性,但它们的用途完全不同:第一个在 Item 中使用,向 Item 集合添加一个元素,而第二个是条件(顺便说一下,它也可以放在几乎所有其他 msbuild 上元素,因此也在 Item 或 ItemGroup 上),当评估为 False 时丢弃内容。

When I run the following: MSBuild.exe MyProject.vcxproj /p:Configuration=Debug /p:Platform=Win32 Which is being applied? Are they combined into one?

通过 /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 然后 '$(Configuration)|$(Platform)' =='Debug|Win32'"将在解析和求值后扩展为 'Debug|Win32'=='Debug|Win32'",后者的求值结果为 True。因此,第一个 PropertyGroup 定义生效,但第二个不生效,因为后者的条件不匹配。结果,名为“UseDebugLibraries”的属性获得值“true”。如果您传递/p:Configuration=Release;Platform=Win32 而不是它会得到值“false”。这最终用于更改执行的编译器/链接器命令,并向其传递一个标志以告知要使用哪个运行时库。

关于c++ - ProjectConfiguration 与 PropertyGroup (MSBuild),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41526822/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com