自定义 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 始终读取环境并为所有环境变量创建(或覆盖)属性。