问题描述
以下摘自常规的VS2010 C ++项目.
The following is taken from a regular VS2010 C++ project.
<ClCompile>
<WarningLevel>Level3</WarningLevel>
<PrecompiledHeader>Use</PrecompiledHeader>
<Optimization>MaxSpeed</Optimization>
<FunctionLevelLinking>true</FunctionLevelLinking>
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
如果我编辑PreprocessorDefinitions
,则可以设置预处理器使用的定义.我可以通过#ifdef
等在代码中看到这一点.
If i edit PreprocessorDefinitions
i can set a definition that is used by the preprocessor. I can see this in my code via #ifdef
etc.
但是,如果我使用以下
<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"
设置的值,但是我无法使用#ifdef
等控制我的构建.如果我使用常规设置并尝试使用<Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"
输出PreprocessorDefinitions
,则该字段实际上为空白,并且不包含预期的<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
,尽管我可以使用这些键中的任何一个使用#ifdef
等来控制我的构建.
i can also see via the message that PreprocessorDefinitions
contains the value i set via Properties="PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING"
but i can not control my build using #ifdef
etc.If i use a regular setup and try to output PreprocessorDefinitions
using <Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"
the field is actually blank and does not contain the expected <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
although i can use any one of those keys to control my build using #ifdef
etc.
- 那是为什么?
- 如何通过任务
Properties
元素在VS2010 C ++项目中传递PreprocessorDefinitions?
- Why is that?
- What can i do to pass PreprocessorDefinitions für a VS2010 C++ Project via the tasks
Properties
element?
推荐答案
您不能在不修改demo.vcxproj
的情况下执行此操作,因为您需要访问CLCompile
的PreprocessorDefinitions
,而不是PropertyGroup
,因此无法通过MSBuild命令行传递.
You can't do this without modifying demo.vcxproj
because you need access to the PreprocessorDefinitions
of CLCompile
, which is not a PropertyGroup
, and thus can't be passed via the MSBuild command line.
您可以通过项目属性->配置属性-> C/C ++->预处理器在GUI中修改预处理器定义,或直接编辑XML:
You can modify the preprocessor definitions in the GUI via Project Properties -> Configuration Propertis -> C/C++ -> Preprocessor, or edit the XML directly:
<ClCompile>
....
<PreprocessorDefinitions>$(MyMacro);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>
在您的MSBuild项目中:
In your MSBuild project:
<Target Name="TestBuild" Returns="@(ManagedTargetPath)">
<MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="MyMacro=THISGETSSETBUTDOESNOTHING"/>
</Target>
这等效于以以下方式运行MSBuild.exe:
This is equivalent to running MSBuild.exe as:
MSBuild demo.vcxproj /p:MyMacro=THISGETSSETBUTDOESNOTHING
这篇关于如何将PreProcessorDefinitions设置为msbuild任务的任务属性的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!