Command line MSBuild.exe既不接受/p:DefineConstants也不接受/p:preprocessOrdDefinition

Command line MSBuild.exe既不接受/p:DefineConstants也不接受/p:preprocessOrdDefinition,command-line,msbuild,macros,c-preprocessor,Command Line,Msbuild,Macros,C Preprocessor,我已经阅读了很多关于堆栈溢出的文章,这些文章回答了“如何从MSBuild命令行将预处理器定义传递给编译器”的问题,它们的回答都有一些变化: MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED 我尝试了我能想到的每一种变化: MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED" MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED" MSBuil

我已经阅读了很多关于堆栈溢出的文章,这些文章回答了“如何从MSBuild命令行将预处理器定义传递给编译器”的问题,它们的回答都有一些变化:

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED
我尝试了我能想到的每一种变化:

MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED"
MSBuild.exe "/p:DefineConstants=THING_TO_BE_DEFINED=1"
MSBuild.exe /p:DefineConstants="THING_TO_BE_DEFINED=1"
…还有几十个。我也曾以类似的方式尝试过覆盖预处理定义。所有这些都触发了下面的#错误:

#include "stdafx.h"

#if !defined(THING_TO_BE_DEFINED)
#error "THING_TO_BE_DEFINED is not defined"
#endif

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
我一直在用上面简单的命令行应用程序以及我这里的一个大型游戏项目来尝试这一点。我只能猜测VisualStudio(我在2005年和2008年看到了这一点)的内部有一些默认设置,这会阻止我的命令行参数被应用,但我没有发现支持这一假设的证据


有什么办法可以让它工作吗?为什么他们不以FSM的名义坚持使用好的ol'-D东西来定义?

如果在命令行上调用MSBuild,则不能指定DefineConstants的值。但如果您正在生成.csproj或其他MSBuild脚本,则可以指定它。如果创建msbuild文件以“替换”解决方案文件,则可以在生成项目时使用该文件指定该文件的值。例如:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <!-- Default value here -->
    <DefineConstants Condition=" '$(DefineConstants)'==''" >DEBUG;TRACE</DefineConstants>
  </PropertyGroup>

  <ItemGroup>
    <Projects Include="one.csproj" />
    <Projects Include="two.csproj" />
  </ItemGroup>

  <Target Name="Build">
    <MSBuild Projects="@(Projects)"
                 Properties="DefineConstants=$(DefineConstants)"/>
  </Target>
</Project>

调试;痕迹
然后可以使用
msbuild.exe buid.proj/p:DefineConstants=“YourValue;Debug;Trace”

注意命令行中引号的用法


不久前,我在上写了一篇关于这方面的博文。

如果您想定义跟踪和调试常量,这应该可以:

msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE"

为完整起见,当我希望在批处理文件中为VB.NET和msbuild版本3.5.30729.1定义
THING\u TO\u BE\u DEFINED=“VALUE-wanted”
时,我发现这是有效的:

@msbuild/t:Rebuild/p:Configuration=Release;平台=“任何CPU”;
DefineConstants=“THING\u TO\u BE\u DEFINED=\“VALUE WANTED\”mysln.sln

(当然全部在一行上)

需要对vcxproj进行以下修改才能使/p正常工作

放 定义状态>

$(DefineConstants);WIN32_调试_安慰单元测试SIM;%(预定义)


通过这种方式,MSBuild将知道,对于预处理器,它需要使用来自Globals PropertyGroup的DefineConstants中的值,除非/p:DefineConstants=“MY_DEFINE”

命令行提供了这些值,否则开发人员交给我的.vcproj将无法使用。Doh.公认的答案实际上是错误的。我发现在我自己的项目中,DefineConstants会被忽略,除非我使用/t:Rebuild选项。这是可行的,但它会覆盖解决方案中每个项目的现有
$(DefineConstants)
变量我只想附加到它上面@那么你认为什么是被接受的答案呢?我真的很好奇,非常感谢!您是唯一提到如何转义双引号以定义字符串的人。