代码之家  ›  专栏  ›  技术社区  ›  Sniggerfardimungus

msbuild.exe不接受/p:defineconstants或/p:preprocessordefinitions

  •  18
  • Sniggerfardimungus  · 技术社区  · 15 年前

    我已经阅读了大量关于堆栈溢出的文章,这些文章回答了“如何从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;
    }
    

    我在上面的简单命令行应用程序以及我在这里的一个大型游戏项目中尝试过这种方法。我只能猜测Visual Studio(我在2005年和2008年看到了这一点)在其内部有一些默认设置,它阻碍了我的命令行参数的应用,但我没有找到支持这一假设的证据。

    我有什么办法让这个工作吗?为什么在金融服务管理的名义下,他们不坚持“好的”定义?

    4 回复  |  直到 7 年前
        1
  •  8
  •   Graviton    12 年前

    如果在命令行上调用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"

    注意命令行中引号的用法。

    我写了一篇关于这个的博客 http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx .

        2
  •  7
  •   Robert Muehsig    12 年前

    如果要定义跟踪调试常量,应该可以:

    msbuild mysln.sln /t:Rebuild /p:Configuration=Release /p:DefineConstants="DEBUG;TRACE"
    
        3
  •  2
  •   Mark Hurd    11 年前

    为了完整起见,这是我发现的在我想要的时候有效的方法。 THING_TO_BE_DEFINED="VALUE WANTED" ,对于vb.net和msbuild版本3.5.30729.1,在批处理文件中:

    @msbuild /t:Rebuild /p:Configuration=Release;Platform="Any CPU";
    DefineConstants="THING_TO_BE_DEFINED=\"VALUE WANTED\"" mysln.sln
    

    (当然都在同一条线上)

        4
  •  2
  •   Moshe    9 年前

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

    放 &; 定义常数 &; 定义常数 gt;

    在下面; 属性群 label=globals>

    < 预处理器定义 美元; 定义 );win32;_debug;_console;unit_test_sim;%(预处理器定义)

    这样,msbuild就会知道,对于预处理器,它需要使用来自globals propertygroup的defineconstants的值,除非由/p:defineconstants=“my_define”从命令行提供。