Visual Studio 项目中的属性继承

Visual Studio 本机项目系统基于 MSBuild。 MSBuild 定义用于生成任何类型项目的文件格式和规则。 它还管理生成多个配置和平台过程中的大部分复杂性。 你会发现,了解它的工作原理很有用。 如果要定义自定义配置,这一点尤其重要。 或者,创建可重用的属性集,以便共享和导入到多个项目中。

.vcxproj 文件、.props 文件和 .targets 文件

项目属性存储在多个文件中。 某些属性直接存储在 项目文件中.vcxproj。 其他属性来自项目文件导入的其他 .targets.props 文件(提供默认值)。 可在基本目录 下特定于区域设置的文件夹中找到 Visual Studio 2015 项目文件%ProgramFiles(x86)%\MSBuild\Microsoft.Cpp\v4.0\v140

项目属性存储在多个文件中。 某些属性直接存储在 项目文件中.vcxproj。 其他属性来自项目文件导入的其他 .targets.props 文件(提供默认值)。 可在基本目录 下特定于区域设置的文件夹中找到 Visual Studio 2017 项目文件%VSINSTALLDIR%Common7\IDE\VC\VCTargets\

项目属性存储在多个文件中。 某些属性直接存储在 项目文件中.vcxproj。 其他属性来自项目文件导入的其他 .targets.props 文件(提供默认值)。 可在基本目录 下特定于区域设置的文件夹中找到 Visual Studio 项目文件%VSINSTALLDIR%\MSBuild\Microsoft\VC\<version><version> 特定于 Visual Studio 的版本。 对于 Visual Studio 2019,它是 v160

属性也存储在你可能想要添加到自己项目的任何自定义 文件中.props。 强烈建议不要手动编辑这些文件。 而是使用 IDE 中的属性页来更改所有属性,特别是参与继承的属性,除非你深入了解 MSBuild 和 文件.vcxproj

如前面所示,相同配置的同一属性在不同文件中可能分配有不同值。 生成项目时,MSBuild 引擎以明确定义的顺序评估项目文件和所有导入的文件(稍后将介绍)。 在评估每个文件时,该文件中定义的任何属性值都将覆盖现有值。 未指定的任何值都从之前已评估的文件继承。 使用属性页设置属性时,也请务必注意设置它的位置。 如果在 文件中将属性设置为“X”,但该属性在项目文件中已设为“Y”,然后将在属性设为“Y”的情况下生成项目.props。 如果在项目项(例如 文件)上,相同的属性已设为“Z”,然后 MSBuild 引擎将使用“Z”值.cpp

这是基本的继承树:

  1. MSBuild CPP 工具集中的默认设置(基本目录中的 Microsoft.Cpp.Default.props 文件,由 .vcxproj 文件导入。)

  2. 属性表

  3. .vcxproj 文件 。 (此文件可能重写默认设置和属性页设置。)

  4. 项元数据

提示

在属性页中,bold 的属性在当前上下文中定义。 普通字体的属性将被继承。

查看包含所有导入值的已扩展项目文件

有时,通过查看展开的文件来确定给定的属性值如何继承非常有用。 若要查看扩展版本,请在 Visual Studio 命令提示中输入以下命令。 (将占位符文件名称更改为要使用的名称。)

msbuild /pp:temp.txt myapp.vcxproj

除非你十分熟悉 MSBuild,否则展开的项目文件可能会很大并且难以理解。 这是项目文件的基本结构:

  1. 基本项目属性,不在 IDE 中显示。

  2. 导入 ,该文件定义了一些基本的、不依赖于工具集的属性Microsoft.cpp.default.props

  3. 全局配置属性在“常规配置”页面上显示为“PlatformToolset”和“项目”默认属性。 这些属性决定下一步将哪个工具集和内部属性表导入 中Microsoft.cpp.props

  4. 导入 ,该文件设置大多数项目默认值Microsoft.cpp.props

  5. 导入所有属性表,包括 文件.user。 这些属性表可以重写内容,但“PlatformToolset”和“项目”默认属性除外

  6. 项目配置属性的其余部分。 这些值可以重写属性表中设置的内容。

  7. 项(文件)及其元数据。 这些项始终是 MSBuild 评估规则的最后一项,即使它们出现在其他属性和导入之前仍是如此。

有关详细信息,请参阅 MSBuild 属性

生成配置

配置只是给定名称的任意一组属性。 Visual Studio 提供“调试”和“发布”配置。 每个配置都会为调试版本或发布版本适当地设置各种属性。 可以使用“配置管理器”来定义自定义配置。 它们是一种方便的方法,可以为特定风格的版本对属性进行分组。

要更好地了解生成配置,请打开“属性管理器”。 你可以通过选择“视图”>“属性管理器”或“视图”>“其他窗口”>“属性管理器”来打开它,具体取决于你的设置。 “属性管理器”具有项目中每个配置和平台对的节点。 这些节点的每个节点下都是为该配置设置某些特定属性的属性表( 文件)的节点.props

“属性管理器”窗口的屏幕截图。

例如,可以转到属性页中的“常规”窗格。 将字符集属性更改为“未设置”而不是“使用 Unicode”,然后单击“确定”。 属性管理器现在不显示“Unicode 支持”属性表。 对于当前配置,它已被删除,但对于其他配置,它仍然存在。

有关属性管理器和属性表的更多信息,请参阅共享或重用 Visual Studio C++ 项目设置

提示

文件是一项旧功能.user。 建议将其删除,以便根据配置和平台正确地对属性分组。