如何将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
等
- 这是为什么?
- 我能做些什么来通过任务
Properties
元素传递一个VS2010 C ++项目的PreprocessorDefinitions?
如果不修改demo.vcxproj
则无法执行此demo.vcxproj
因为您需要访问CLCompile
(不是PropertyGroup
的PreprocessorDefinitions
,因此无法通过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。