自定义 C++ 生成

对于 C++ 项目,无法按相同的方式使用自定义 .targets.props 文件来覆盖默认设置。 本文介绍一种不同的自定义生成方法,该方法适用于 C++ 生成。

可用于自定义 .NET 项目的文件 Directory.Build.props 由 Microsoft.Common.props 导入 Microsoft.Cpp.Default.props,而大多数默认设置都在 Microsoft.Cpp.props 中定义;并且,由于已经定义,许多属性都不能使用“如果尚未定义”条件,但是对于在 PropertyGroup 中使用 Label="Configuration" 定义的特殊项目属性,默认设置必须不同(请参阅 .vcxproj 和 .props 文件结构)。

对于 C++ 项目,可以使用以下属性指定要在 Microsoft.Cpp.* 文件之前/之后自动导入的 .props 文件:

  • ForceImportAfterCppDefaultProps
  • ForceImportBeforeCppProps
  • ForceImportAfterCppProps
  • ForceImportBeforeCppTargets
  • ForceImportAfterCppTargets

要自定义所有 C++ 生成的默认属性值,请创建另一个 .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 始终读取环境并为所有环境变量创建(或覆盖)属性。