2010-01-06 59 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」