2010-01-06 15 views
16

He pasado por un buen número de artículos sobre Stack Overflow que respondieron a la pregunta "¿Cómo paso las definiciones de preprocesador al compilador desde la línea de comandos de MSBuild? ", y todos ellos respondieron con alguna variación de:MSBuild.exe no acepta ni/p: DefinineConstants nor/p: PreprocessorDefinitions

MSBuild.exe /p:DefineConstants=THING_TO_BE_DEFINED 

he intentado todas las variaciones que podría llegar a:

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" 

... y docenas de otros. También he coqueteado con la anulación de PreprocessorDefinitions de manera similar. Todos ellos desencadenó la #error a continuación:

#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; 
} 

He estado tratando esto con la aplicación de línea de comandos sencilla arriba, así como con un gran proyecto de juego que tengo aquí. Solo puedo adivinar que Visual Studio (estoy viendo esto con 2005 y 2008) tiene un conjunto predeterminado profundamente en sus entrañas que impide que se aplique mi argumento de línea de comando, pero no he encontrado evidencia que respalde esta hipótesis.

¿Alguna idea sobre cómo puedo hacer que esto funcione? ¿Por qué en nombre de FSM no se quedaron con la buena idea de TH-D THING_TO_BE_DEFINED?

Respuesta

7

Si llama a MSBuild en la línea de comandos, no puede especificar el valor para DefinirConstantes. Pero si está compilando un .csproj u otro script de MSBuild, puede especificarlo. Si crea un archivo msbuild para "reemplazar" su archivo de solución, puede usarlo y especificar el valor para eso cuando construya sus proyectos. Por ejemplo:

<?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> 

continuación, puede utilizar msbuild.exe buid.proj /p:DefineConstants="YourValue;Debug;Trace"

Nota el uso de las comillas en la línea de comandos.

He escrito una publicación de blog hace un tiempo sobre algo relacionado con esto en http://sedodream.com/2008/05/07/MSBuildBuildingTheSameProjectMultipleTimes.aspx.

+2

estoy atascado con el .vcproj que el desarrollador me da. Doh. – Sniggerfardimungus

6

Si desea definir TRACE & Constantes depurar este debería funcionar:

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

La respuesta aceptada es realmente incorrecta. He encontrado para mis propios proyectos que se ignora DefineConstants, a menos que use la opción/t: Rebuild. –

+4

Esto funciona, pero sobrescribe la variable '$ (DefineConstants)' existente - ¡PARA CADA PROYECTO en la solución! - ¡Solo quiero anexarme a eso! – BrainSlugs83

1

Para completar, esto es lo que encontré trabajaba cuando quería THING_TO_BE_DEFINED="VALUE WANTED", para VB.NET, y la versión 3.5.30729.1 msbuild, en un archivo por lotes:

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

(todo en una línea, por supuesto)

+1

+1 ¡Muchas gracias! Usted es el único que menciona cómo escapar de las comillas dobles para definir cadenas. – Arnaud

2

El a continuación se necesita modificar el vcxproj para que el/p funcione.

poner < DefineConstants> </DefineConstants>

bajo la < PropertyGroup label = Globals>

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

De esta manera MSBuild sabrá que para el preprocesador que necesita para utilizar los valores de los DefineConstants que provienen de la Globals PropertyGroup menos que se disponga de la línea de comandos por el/t: DefineConstants = "MY_DEFINE"

Cuestiones relacionadas