如何将预处理定义设置为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>

如何将预处理定义设置为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>,msbuild,Msbuild,我还可以通过消息看到,PreprocessorDefinitions包含我通过Properties=“PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING”设置的值,但我无法使用\ifdef等来控制我的构建。 如果我使用常规设置并尝试使用输出预OrderDefinitions,那么在不修改demo.vcxproj的情况下,您无法执行此操作,因为您需要访问CLCompile的预OrderDefinitions,它不是属性组,因此无法通过MSBuild命

我还可以通过消息看到,
PreprocessorDefinitions
包含我通过
Properties=“PreprocessorDefinitions=THISGETSSETBUTDOESNOTHING”
设置的值,但我无法使用
\ifdef
等来控制我的构建。
如果我使用常规设置并尝试使用
输出
预OrderDefinitions
,那么在不修改
demo.vcxproj
的情况下,您无法执行此操作,因为您需要访问
CLCompile
预OrderDefinitions
,它不是
属性组
,因此无法通过MSBuild命令行传递

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

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

这可以在不修改原始项目的情况下完成:第一个在微软.CPP。目标中通常是在一个普通C++项目中导入的最后一个东西,它是检查是否有一个属性叫做“代码>强制输入预测目标< /代码>,如果是,导入它。 因此,假设您想向预处理器定义中添加

附加的
,您创建了一个文件“override.props”,如下所示(为了实现完全自动化,请使用
WritelinesToFile
任务创建该文件):

注意,正如richb在注释中指出的,只有在msbuild的查找规则可以找到override.props的情况下,上述方法才有效。要确保始终找到它,只需指定完整路径

更新

几年后,在msbuild 15及更高版本中,出现了。与上面的原理相同,但更简单:msbuild将自动拾取项目文件目录中名为
Directory.Build.props
的文件,甚至拾取该文件上方的所有目录,而不需要额外的命令行选项(因此,在VS中也可以正常工作)。项目文件也变得不那么冗长了:

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

%(预定义);附加的

基于@Kevin answer,您需要在属性表中定义用户定义的宏。然后创建一个引用用户定义宏的预处理器。现在可以在代码中使用新的预处理器值。最后,对于构建,您可以使用
/p
标志更改用户定义宏的值。 在这里,我定义了一个用户定义的值,如
mymacro
,以及一个预处理器值,如
VAL
。 现在,您只需使用
/p:mymacro=“\”some thing new\”
编译项目即可


msbuildyourproject.vcxproj/p:mymacro=“\”一些新东西\

谢谢您提供的信息,非常有用。只是几处更正。首先,命令行参数是/p:not/t:。其次,您需要指定override.props的完整路径,否则msbuild会在没有任何警告的情况下忽略它。我只想强调提到@richb的完整路径,我发现这一点对于实现此功能非常关键。通过输出节,它也可以与资源编译器定义一起工作。是的,实际上答案中的最后一个短语是误导性的-即使文件位于调用vcxproj或msbuild的同一目录中,它也不起作用。我花了相当多的时间来解决这个问题。很抱歉,我会将它改为完全路径,它总是有效的,而且更实用。是的,由于找不到.props文件而导致加载该文件的无声失败是令人讨厌的。您只需在.props文件中故意使用格式不正确的xml,即可再次检查文件路径是否正确。如果正确找到.props文件,它将在构建时打印错误。在我的2017版本中,这些都不起作用,而且我没有ClCompile部分。我不经常在MSVC/VS世界中工作..,更多Eclipse。我已经添加了一个新的文件夹和一个空的CPP文件,但是像一个构建路径,我认为它还没有被识别,和/或C++的“面”不是在“聚合”项目文件中。当我意识到错误出现在单独的子项目vcxproj文件中,这些文件定义了它们自己的预处理器语句,导致出现大量xkeycheck错误时,我发现每个项目都需要编辑。。谢谢你!
  <Target Name="TestBuild" Returns="@(ManagedTargetPath)">
    <MSBuild Projects="demo.vcxproj" Targets="NormalBuild" Properties="MyMacro=THISGETSSETBUTDOESNOTHING"/>
  </Target>
  MSBuild demo.vcxproj /p:MyMacro=THISGETSSETBUTDOESNOTHING
<?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
<Project>
  <ItemDefinitionGroup>
    <ClCompile>
      <PreprocessorDefinitions>%(PreprocessorDefinitions);ADDITIONAL</PreprocessorDefinitions>
    </ClCompile>
  </ItemDefinitionGroup>
</Project>
#include <iostream>


int main() {
    std::cout << VAL << std::endl;

    getchar();
}
<ClCompile>
  ...
  <PreprocessorDefinitions>VAL=$(mymacro);%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ClCompile>