自定义 C++ 生成

可以使用 Directory.Build.props 和 Directory.Build.targets 自定义公共父文件夹下的所有 C++ 项目。 请参阅按文件夹自定义。 此外,C++ 项目还提供以下扩展点。 可以使用以下属性指定要在 Microsoft.Cpp.* 文件之前或之后自动导入的 .props.targets 文件

  • ForceImportAfterCppDefaultProps
  • ForceImportBeforeCppProps
  • ForceImportAfterCppProps
  • ForceImportBeforeCppTargets
  • ForceImportAfterCppTargets

借助这些导入可控制依赖其他属性的属性或依赖其他目标的目标的定义顺序。 .vcxproj 中的导入顺序如下所示:

   vcxproj
      Microsoft.Cpp.default.props
         Microsoft.Common.props
            Directory.Build.props
      Microsoft.Cpp.props
      Microsoft.Cpp.targets
         Microsoft.Common.targets
            Directory.Build.targets

请参阅 .vcxproj 和 .props 文件结构。 如果需要定义的属性使用了在 Microsoft.Cpp.default.props 或 Microsoft.Cpp.props 中定义的其他属性,则可以创建另一个 .props 文件(例如 MyProps.props),并在 Directory.Build.props 中定义一个指向该属性的 ForceImportAfterCppProps 属性:

<PropertyGroup>
  <ForceImportAfterCppProps>$(MSBuildThisFileDirectory)\MyProps.props</ForceImportAfterCppProps>
</PropertyGroup>

MyProps.props 会自动导入到 Microsoft.Cpp.props 的最末尾 。

自定义所有 C++ 生成

不建议自定义 Visual Studio 安装,因为无法轻松跟踪此类自定义项,但如果要扩展 Visual Studio 以自定义特定平台的 C++ 生成,则可以为每个平台创建 .targets 文件,并将这些文件作为 Visual Studio 扩展的一部分放在适用于这些平台的相应导入文件夹中。

Win32 平台的 .targets 文件 (Microsoft.Cpp.Win32.targets) 包含以下 Import 元素:

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportBefore\*.targets"
        Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportBefore')"
/>

同一文件的末尾附近有一个相似的元素:

<Import Project="$(VCTargetsPath)\Platforms\Win32\ImportAfter\*.targets"
        Condition="Exists('$(VCTargetsPath)\Platforms\Win32\ImportAfter')"
/>

*%ProgramFiles32%\MSBuild\Microsoft.Cpp\v{version}\Platforms 中的其他目标平台也存在类似的导入元素。

根据平台将 .targets 文件放在适当的 ImportAfter 文件夹中后,MSBuild 会将文件导入到该平台的每个 C++ 生成中。 如果需要,可以将多个 .targets 文件放在那里。

使用 Visual Studio 扩展性可以进行进一步的自定义,例如定义新平台。 有关详细信息,请参阅 C++ 项目扩展性

在命令行上指定自定义导入

对于要针对某个 C++ 项目的特定生成加入的自定义 .targets,请在命令行上设置 ForceImportBeforeCppTargets 和/或 ForceImportAfterCppTargets 属性。

msbuild /p:ForceImportBeforeCppTargets="C:\build\config\Custom.Before.Microsoft.Cpp.Targets" MyCppProject.vcxproj

对于全局设置(例如,要影响生成服务器上某个平台的所有 C++ 生成),有两种方法。 首先,可以使用始终设置的系统环境变量来设置这些属性。 此方法之所以可行,是因为 MSBuild 始终读取环境并为所有环境变量创建(或覆盖)属性。