自定义 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 始终读取环境并为所有环境变量创建(或覆盖)属性。
相关内容
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈