2010-01-06 98 views
16

我经历过不少在回答这一问题上堆栈溢出的文章“我如何通过预处理器定义编译器从MSBuild的命令行”他们都报以的一些变化:数十人MSBuild.exe不接受任何/ P:DefineConstants也不/ P:PreprocessorDefinitions

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" 

...和:

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED 

我都想尽变化,我可以拿出。我也以类似的方式调用重写PreprocessorDefinitions。他们都引发下面的#ERROR:

#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年看到这个)有一些默认设置,它阻止了我的命令行参数被应用,但是我没有发现证据支持这个假设。

关于如何让这个工作的任何想法?为什么以FSM的名义,他们没有坚持良好的醇'-D THING_TO_BE_DEFINED?

回答

7

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

我坚持开发人员给我的.vcproj。卫生署。 – Sniggerfardimungus 2010-02-05 18:26:01

6

如果要定义TRACE & DEBUG常量这应该工作:

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

接受的答案实际上是不正确的。我发现我的项目中DefineConstants被忽略,除非我使用/ t:Rebuild选项。 – 2014-03-26 16:21:31

+4

这有效,但它覆盖了现有的$(DefineConstants)变量 - 对于解决方案中的每个项目! - 我只想追加它! – BrainSlugs83 2014-09-16 19:50:11

1

为了完整,这是当我想要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 

(全部在过程的一行)

+1

+1非常感谢!为了定义字符串,你是唯一一个提及如何逃避双引号的人。 – Arnaud 2015-02-28 09:54:41

2

的下面是需要修改vcxproj以使/ p工作。

放 < DefineConstants> </DefineConstants>

的< 的PropertyGroup标签下=全局>

< PreprocessorDefinitions> $(DefineConstants); WIN32; _DEBUG ; _CONSOLE; UNIT_TEST_SIM;%(PreprocessorDefinitions)

这样的MSBuild就会知道,对于预处理器,它需要从来自全局的PropertyGroup的DefineConstants使用的值,除非由使用/ p命令行提供:DefineConstants =“MY_DEFINE”