gpt4 book ai didi

msbuild - 如何将 PreProcessorDefinitions 设置为 msbuild 任务的任务属性

转载 作者:行者123 更新时间:2023-12-02 07:13:41 29 4
gpt4 key购买 nike

以下内容摘自常规 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我可以设置预处理器使用的定义。我可以通过 #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" 设置的值但我无法使用 #ifdef 控制我的构建ETC。如果我使用常规设置并尝试输出 PreprocessorDefinitions使用<Message Text="PreprocessorDefinitions: $(PreprocessorDefinitions)"该字段实际上是空白的,不包含预期的 <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>尽管我可以使用这些键中的任何一个来控制我的构建,使用 #ifdef等等

  1. 这是为什么?
  2. 如何通过任务 Properties 传递 VS2010 C++ 项目的预处理器定义元素?

最佳答案

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

因此,假设您想将 ADDITIONAL 添加到您创建的文件“override.props”,如下所示(为了完全自动化,请使用 WritelinesToFile 任务来创建文件):

<?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 在评论中指出的那样,只有当 msbuild 的查找规则可以找到 override.props 时,上述内容才有效。为了确保始终可以找到它,只需指定完整路径即可。

更新

几年后,在 msbuild 15 及更高版本中,有 new ways to customise builds 。与上面的原理相同,但更简单:msbuild 将自动拾取项目文件目录中名为 Directory.Build.props 的文件,甚至是上面的所有目录,而不需要额外的命令行选项(因此,也可以从VS内部没有问题)。项目文件也变得不那么冗长:

<Project>
<ItemDefinitionGroup>
<ClCompile>
<PreprocessorDefinitions>%(PreprocessorDefinitions);ADDITIONAL</PreprocessorDefinitions>
</ClCompile>
</ItemDefinitionGroup>
</Project>

关于msbuild - 如何将 PreProcessorDefinitions 设置为 msbuild 任务的任务属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15141429/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com