.vcxproj 文件和通配符

Visual Studio IDE 不支持在 .vcxproj 文件的项目项中使用某些构造。 这些不受支持的构造包括通配符、分号分隔列表或扩展到多个文件的 MSBuild 宏。 C++ 生成的 .vcxproj 项目系统具有比 MSBuild 更高的限制。 每个项目项都要求有自己的 MSBuild 项。 有关 .vcxproj 文件格式的详细信息,请参阅 .vcxproj.props 文件结构

IDE 不支持以下构造示例:

<ItemGroup>
  <None Include="*.txt">
  <ClCompile Include="a.cpp;b.cpp"/>
  <ClCompile Include="@(SomeItems)" />
</ItemGroup>

如果在 IDE 中加载包含这些构造的 .vcxproj 项目文件,项目一开始似乎能够正常工作。 但是,在 Visual Studio 修改项目并将其保存在磁盘后,问题可能会立即出现。 可能会遇到随机崩溃和未定义的行为。

在 Visual Studio 2019 版本 16.7 中,当 Visual Studio 加载 .vcxproj 项目文件时,它会自动检测项目项中不支持的条目。 在加载解决方案期间,可在“输出”窗口中看到警告。

Visual Studio 2019 版本 16.7 还增加了只读项目支持。 只读支持允许 IDE 使用手动创作的项目,这些项目对 IDE 可编辑项目没有附加限制。

如果你拥有的 .vcxproj 文件使用一个或多个不受支持的构造,可以使用以下选项之一在 IDE 中加载它而不发出警告:

  • 显式列出所有项
  • 将项目标记为只读
  • 将通配符项移动到目标正文

显式列出所有项

目前,无法在非只读项目的“解决方案资源管理器”窗口中显示通配符扩展项。 解决方案资源管理器需要项目显式列出所有项。

若要使 .vcxproj 项目在 Visual Studio 2019 版本 16.7 或更高版本中自动展开通配符,请将 ReplaceWildcardsInProjectItems 属性设置为 true。 建议在根目录中创建 Directory.Build.props 文件,并使用以下内容:

<Project>
  <PropertyGroup>
    <ReplaceWildcardsInProjectItems>true</ReplaceWildcardsInProjectItems>
  </PropertyGroup>
</Project>

将项目标记为只读

在 Visual Studio 2019 版本 16.7 及更高版本中,可以将项目标记为只读。 若要将项目标记为只读,请将以下属性添加到 .vcxproj 文件,或将其添加到该文件导入的任何文件:

<PropertyGroup>
    <ReadOnlyProject>true</ReadOnlyProject>
</PropertyGroup>

<ReadOnlyProject> 设置可阻止 Visual Studio 编辑和保存项目,以便你可以使用其中的任何 MSBuild 构造,包括通配符。

请务必了解,如果 Visual Studio 检测到 .vcxproj 文件或该文件导入的任何文件的项目项中存在通配符,项目缓存将不可用。 如果有很多项目使用通配符,则 IDE 中的解决方案加载时间会长得多。

将通配符项移动到目标正文

你可能需要使用通配符来收集资源、添加生成的源等。 如果不需要在解决方案资源管理器窗口中列出它们,则可以改用以下过程:

  1. 更改项组的名称以添加通配符。 例如,不是:

    <Image Include="*.bmp" />
    <ClCompile Include="*.cpp" />
    

    而是将其更改为:

    <_WildCardImage Include="*.bmp" />
    <_WildCardClCompile Include="*.cpp" />
    
  2. 将此内容添加到 .vcxproj 文件。 或者,将其添加到根目录中的 Directory.Build.targets 文件,从而影响该根目录下的所有项目:

    <Target Name="AddWildCardItems"
        AfterTargets="BuildGenerateSources">
      <ItemGroup>
        <Image Include="@(_WildCardImage)" />
        <ClCompile Include="@(_WildCardClCompile)" />
      </ItemGroup>
    </Target>
    

    此更改会使生成发现在 .vcxproj 文件中定义的项。 但是,现在它们在“解决方案资源管理器”窗口中不可见,它们不会在 IDE 中引起问题。

  3. 若要在编辑器中打开这些文件时显示 _WildCardClCompile 项的正确 IntelliSense,请添加以下内容:

    <PropertyGroup>
      <ComputeCompileInputsTargets>
        AddWildCardItems
        $(ComputeCompileInputsTargets)
      </ComputeCompileInputsTargets>
    </PropertyGroup>
    

实际上,可以将通配符用于目标正文中的任何项。 还可以在 ProjectSchemaDefinition 未将其定义为项目项的 ItemGroup 中使用通配符。

注意

如果将通配符包含文件从 .vcxproj 文件移动到导入的文件,则它们不会显示在“解决方案资源管理器”窗口中。 此更改还允许在 IDE 中加载项目,而无需对其进行修改。 但是,不建议使用此方法,因为它会禁用项目缓存。

另请参阅

在 Visual Studio 中设置 C++ 编译器并生成属性
属性页 XML 文件