使用项目属性

在 IDE 中,所有编译器选项、链接器选项、调试器设置和自定义生成步骤都显示为“属性”。可以使用项目的属性页查看和修改项目的属性。你可以将项目属性独立应用于生成配置(调试或发布)和目标平台(Win32、x64 或 ARM)的任意组合。你还可以为项目中的各文件设置属性。

虽然可以根据每个用户和每台计算机设置“全局”属性,但我们不建议这样做。相反,建议你使用**“属性管理器”**创建属性表来存储你希望能够重新使用或与其他人共享的每一类项目的设置。属性表还使无意中更改其他项目类型的属性设置的可能性变小。本文随后将详细讨论属性表。

若要显示**“属性管理器”,请在菜单栏上依次选择“视图”“其他窗口”“属性管理器”**。

Visual C++ 项目系统基于 MSBuild。虽然可以直接在命令行上编辑 XML 项目文件和属性表,我们仍建议你使用 IDE,在你修改参与继承的属性时,这一点尤为重要。Visual C++ 项目系统不一定可以识别在 MSBuild 中有效的手动编辑文件,在生成过程中可能产生细微错误。

项目文件是文件扩展名为 .vcxproj 的 XML 文件。所有在 IDE 中设置的属性直接写入项目文件或生成时导入的属性表中。

下图显示了 Visual C++ 项目的属性页。请注意,在左窗格中,选中**“VC++ 目录”规则,右窗格中将显示与规则关联的属性。($(...) 值是宏,将在本文后面部分进行讨论。)VC++ 目录是配置属性,对应不同配置,其值可以不同,例如 Debug 对应 Release。你可以使用对话框顶部的“配置”“平台”列表框设置适用于属性的配置;在许多情况下,“所有平台”“所有配置”就是合适的选择。“通用属性”**规则中的设置适用于所有配置。

项目属性页

设置项目属性

总而言之,此处介绍了如何设置项目的属性:

设置项目属性

  1. 在菜单栏上,依次选择**“项目”“属性”。或者在“解决方案资源管理器”“属性管理器”中,打开项目的快捷菜单,然后选择“属性”。此时将打开“属性页”**对话框。

  2. 在对话框顶部的框中,选择要应用设置的配置和平台。

    若要创建或修改出现在**“配置”框中的配置,请选择“配置管理器”**按钮。

  3. 设置属性值。选择**“确定”**按钮后,新值就会写入项目文件。

说明说明

“属性页”对话框仅显示适用于当前项目的属性页。例如,如果该项目没有 .idl 文件则不会显示 MIDL 属性页。

有关**“属性页”**对话框中属性的详细信息,请参阅:

提示提示

你可以在“快速启动”窗口中键入属性页的名称,直接打开该属性页。

硬编码属性与宏

某些项目属性可当做一个值处理,可被引用为其他位置定义的属性。这种值称为“宏”,用于将自己与其他种类的项目属性设置区分开来。宏可以指由 MSBuild 系统定义或你自己定义的属性。通过使用宏(而不是硬编码值,例如目录路径),你可更轻松地在计算机之间以及 Visual Studio 的版本之间共享属性设置,并且可更好地确保项目设置正确地参与属性继承。

  • 全局宏
    应用于项目配置的所有项目。具有语法 $(name)。全局宏的示例是 $(VCInstallDir),它存储 Visual Studio 安装的根目录。全局宏与 MSBuild 中的 PropertyGroup 相对应。

  • 项宏
    具有语法 %(name)。对于文件来说,仅适用于该文件的项宏,例如可以使用 %(AdditionalIncludeDirectories) 来指定仅适用于特定文件的包含目录。这种项宏与 MSBuild 中的 ItemGroup 元数据相对应。在项目配置中使用时,项宏适用于特定类型的所有文件。例如,C/C++**“预处理器定义”**配置属性可以获取适用于项目中所有 .cpp 文件的 %(PreprocessorDefinitions) 项宏。这种项宏与 MSBuild 中的 ItemDefinitionGroup 元数据相对应。有关详细信息,请参阅项定义

你可以使用宏定义属性值,也可以使用属性编辑器查看可用宏的值。

属性编辑器

你可以使用属性编辑器来修改特定字符串属性,选择宏作为值。若要访问“属性编辑器”,在属性页中选择属性,然后选择右侧的向下箭头按钮。如果下拉列表包含 <“编辑”>,那么你可以选择它来显示该属性的属性编辑器。

属性_编辑器_下拉列表

在属性编辑器中,你可以选择**“宏”按钮查看可用宏及这些宏的当前值。下图显示选中“宏”按钮后,“附加包含目录”属性的属性编辑器。如果选中“从父级或项目默认设置继承”**复选框并添加了新值,则该值会附加到当前被继承的任意值。如果清除复选框,则新值会替换继承值。在大多数情况下,选中复选框。

属性编辑器,Visual C++

共享可重用的属性配置

如果你想将经常使用的属性集应用于多个项目,则可以使用**“属性管理器”在可重用的属性表文件中捕获,按照惯例,文件的扩展名为 .props。你可以将一张或多张表应用于新项目,这样就不必从零开始设置属性。若要访问“属性管理器”,在菜单栏中选择“视图”“属性管理器”**。

如果选择**“添加新项目属性表”**,然后进行选择(例如 MyProps.props 属性表),将显示属性页对话框。请注意,适用于 MyProps 属性表;你所做的任何更改都将写入表中,而非属性文件 (.vcxproj) 中。

如果直接在 .vcxproj 文件中设置同一属性,属性表中的属性将被重写。

你可以按所需的频率导入属性表。一个解决方案中的多个项目可从同一个属性表继承设置,一个项目可有多个表。属性表自身可以从另一个属性表继承设置。

重要说明重要事项

由于 .props 文件不作为项目项创建,因此该文件默认不参与源代码管理。如果你希望将文件加入源代码管理,则可以手动添加文件作为解决方案项。

创建属性表

  1. 在菜单栏上,依次选择**“查看”“属性管理器”。此时将打开“属性管理器”**。

  2. 若要定义属性表的范围,请选择属性表适用的项。这可能是一个特殊配置,或另一个属性表。打开该项的快捷菜单,然后选择**“添加新项目属性表”**。指定一个名称和位置。

  3. 在**“属性管理器”**中,打开新的属性表然后设置要包括的属性。

属性继承

项目属性已分层。每层继承前一层的值,但是继承的值可以通过设置属性显式重写。这是基本的继承树:

  1. 来自 MSBuild CPP 工具集的默认设置(..\Program Files\MSBuild\Microsoft.Cpp\v4.0\Microsoft.Cpp.Default.props,由 .vcxproj 文件导入。)

  2. 属性表

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

  4. 项元数据

提示提示

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

项目文件 (.vcxproj) 在生成时导入其他属性表。在导入所有属性表后,对项目文件进行计算,然后所有属性值都使用最后一个定义。有时,通过查看展开的文件来确定给定的属性值如何继承非常有用。若要查看扩展版本,请在 Visual Studio 命令提示中输入以下命令。(将占位符文件名称更改为要使用的名称。)

msbuild /pp:temp.txtmyapp**.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 属性

.user 文件以及存在问题的原因

过去的 Visual Studio 版本使用了全局属性表,此表包含 .user 文件名扩展,并且位于 <userprofile>\AppData\Local\Microsoft\MSBuild\v4.0\ folder。我们不再推荐这些文件,因为它们是针对每个用户、每台计算机来设置项目配置属性的。特别是如果你在生成计算机上面向多个平台,此类“全局”设置会影响生成。例如,如果你同时拥有一个 MFC 项目和 Windows Phone 项目,则其中一个项目的 .user 属性将会无效。可重用的属性表更为灵活,而且更加可靠。

尽管 Visual Studio 仍安装 .user 文件并参与属性继承,但默认情况下,这些文件为空。最佳做法是删除项目在**“属性管理器”**中的引用,以确保项目按每个计算机设置和每个用户独立运行。这对确保在 SCC(源代码管理)环境中的正确行为来说非常重要。

添加包含目录到默认目录集

在将包含目录添加到项目中时,请勿重写所有默认目录,这点非常重要。添加目录的正确方法是追加新路径,例如“C:\MyNewIncludeDir\”,然后追加**“$(IncludePath)”**宏为属性值。

创建用户定义的宏

你可以创建用户定义的宏,以便在项目生成中将宏用作变量。例如,可以创建一个用户定义的宏来提供自定义生成步骤或自定义生成工具的值。用户定义的宏是名称/值对。在项目文件中,使用 $(name) 表示法访问该值。

用户定义的宏存储在属性表中。如果你的项目尚未包含属性表,请按照中的步骤创建一个属性表。

创建用户定义的宏

  1. 在**“属性管理器”窗口中(在菜单栏上,依次选择“视图”“属性管理器”),打开属性表的快捷菜单(名称以 .user 结尾),然后选择“属性”。此时将打开该属性表的“属性页”**对话框。

  2. 在对话框的左窗格中,选择**“用户宏”。在右窗格中,选择“添加宏”按钮,打开“添加用户宏”**对话框。

  3. 在对话框中,指定宏的名称和值。(可选)选中**“将此宏设置为生成环境中的环境变量”**复选框。

设置生成的环境变量

Visual C++ 编译器 (cl.exe) 可识别某些环境变量,尤其是 LIB、LIBPATH、PATH 和 INCLUDE。使用 IDE 生成时,“VC++ 目录”属性页属性页中设置的属性用于设置那些环境变量。如果已设置了 LIB、LIBPATH 和 INCLUDE 值(例如通过开发人员命令提示设置),则这些值将被相应的 MSBuild 属性的值替换。然后生成在 PATH 前预置 VC++ 目录可执行目录属性的值。你可以通过创建用户定义的宏然后选中显示**“在生成环境中将此宏设置为环境变量”**的框来设置用户定义的环境变量。

设置调试会话的环境变量

在项目**“属性页”对话框的左窗格中,展开“配置属性”,然后选择“调试”**。

在右窗格中,修改**“环境”“合并环境”项目设置,然后选择“确定”**按钮。

查看所有宏及其值

在项目的**“属性页”对话框中,选择字符串属性(例如“VC++ 目录”),在右列中选择下箭头按钮,然后选择“<编辑>”,打开属性编辑器。在属性编辑器中,选择“宏”**按钮。

同时设置多个配置的属性

若要为所有配置设置属性,请在项目**“属性页”对话框顶部的框中,选择“所有配置”“所有平台”**,然后设置所需的属性。

若要只为某些配置设置属性,请在**“属性管理器”中选择多个配置,然后打开快捷菜单并选择“属性”**。你更改的任何设置将应用于所选的每个配置。

你还可以为多个配置创建一个属性表。为此,请为每个配置创建属性表,打开其中一个配置的快捷菜单,选择**“添加现有属性表”**,然后添加其他表。但是,如果使用一个常用属性表,请注意在设置属性时,它会获取该表适用的所有配置设置,而且 IDE 不会显示从给定属性表继承的项目或其他属性表。

在具有多个项目的大型解决方案中,创建解决方案级别的属性表非常有用。在将项目添加到解决方案时,请使用**“属性管理器”**将该属性表添加到项目中。如果项目级别为必填字段,则可以添加一个新属性表以设置指定的项目值。

快速浏览和搜索所有选项

**“所有选项”属性页(在“属性页”对话框左窗格中“C/C++”**节点下)可实现快速浏览和搜索当前上下文中可用的属性。它具有特殊的搜索框和简单的语法,能够帮助你筛选结果:

  • 无前缀:
    仅在属性名称中搜索(不区分大小写的子字符串)。

  • '/' 或 '-':
    仅在编译器开关中搜索(不区分大小写的前缀)

  • v:
    仅在值中搜索(不区分大小写的子字符串)。

请参见

其他资源

创建和管理 Visual C++ 项目