如何将PreProcessorDefinitions设置为msbuild任务的任务

以下内容来自一个常规的VS2010 C ++项目。

<ClCompile> <WarningLevel>Level3</WarningLevel> <PrecompiledHeader>Use</PrecompiledHeader> <Optimization>MaxSpeed</Optimization> <FunctionLevelLinking>true</FunctionLevelLinking> <IntrinsicFunctions>true</IntrinsicFunctions> <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> 

如果我编辑PreprocessorDefinitions我可以设置PreprocessorDefinitions使用的定义。 我可以通过#ifdef等在我的代码中看到这个

但是,如果我使用以下

  <Target Name="NormalBuild" Condition=" '$(_InvalidConfigurationWarning)' != 'true' " DependsOnTargets="_DetermineManagedStateFromCL;CustomBeforeBuild;$(BuildDependsOn)" Returns="@(ManagedTargetPath)"> <ItemGroup> <ManagedTargetPath Include="$(TargetPath)" Condition="'$(ManagedAssembly)' == 'true'" /> </ItemGroup> <Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)" Importance="High" /> </Target> <Target Name="TestBuild" Returns="@(ManagedTargetPath)"> <MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"/> </Target> 

我也可以通过消息看到, PreprocessorDefinitions包含我通过Properties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"设置的值,但我无法控制我的构build使用#ifdef等。如果我使用常规的设置,并尝试使用<Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"输出PreprocessorDefinitions <Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"字段实际上是空白的,并且不包含预期的<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>尽pipe我可以使用这些键中的任何一个来控制我的构build#ifdef

  1. 这是为什么?
  2. 我能做些什么来通过任务Properties元素传递一个VS2010 C ++项目的PreprocessorDefinitions?

如果不修改demo.vcxproj则无法执行此demo.vcxproj因为您需要访问CLCompile (不是PropertyGroupPreprocessorDefinitions ,因此无法通过MSBuild命令行进行传递。

您可以通过项目属性 – >configuration属性 – > C / C ++ – >预处理器修改GUI中的预处理器定义,或直接编辑XML:

  <ClCompile> .... <PreprocessorDefinitions>$(MyMacro);%(PreprocessorDefinitions)</PreprocessorDefinitions> </ClCompile> 

在你的MSBuild项目中:

  <Target Name="TestBuild" Returns="@(ManagedTargetPath)"> <MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="MyMacro=THISGETSSETBUTDOESNOTHING"/> </Target> 

这相当于运行MSBuild.exe为:

  MSBuild demo.vcxproj /p:MyMacro=THISGETSSETBUTDOESNOTHING 

这可以在不修改原始项目的情况下完成:在Microsoft.Cpp.Targets完成的第一件事,通常是在普通C ++项目中导入的最后一件事情之一是检查是否有名为ForceImportBeforeCppTargets的属性,如果是这样,导入它。

因此,假设你想添加ADDITIONAL到预处理器定义中,像这样创build一个文件'override.props'(为了完全自动化,使用WritelinesToFile任务来创build文件):

 <?xml version="1.0" encoding="utf-8"?> <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> <ItemDefinitionGroup> <ClCompile> <PreprocessorDefinitions>%(PreprocessorDefinitions);ADDITIONAL</PreprocessorDefinitions> </ClCompile> </ItemDefinitionGroup> </Project> 

并致电

 <MSBuild Projects="demo.vcxproj" Properties="ForceImportBeforeCppTargets=override.props"/> 

或从命令行将是

 msbuild demo.vcxproj /p:ForceImportBeforeCppTargets=override.props 

请注意 ,在注释中,richb指出,上述仅适用于如果override.props可以通过msbuild的查找规则find。 为了确保find它,只需指定完整的path。