visual valida studio pudo linea iniciar ejecutar desde correctamente consola compilar comandos comando aplicacion c++ visual-studio msbuild

c++ - studio - csc exe no es valida



msbuild: establece un predefinidor específico#define en la línea de comando (9)

La respuesta es: NO PUEDES

En un archivo C ++, tengo un código como este:

#if ACTIVATE # pragma message( "Activated" ) #else # pragma message( "Not Activated") #endif

Quiero establecer esta definición ACTIVE en 1 con la línea de comandos msbuild.

Intentó esto pero no funciona:

msbuild /p:DefineConstants="ACTIVATE=1"

¿Alguna idea?


Creo que quieres:

/p:DefineConstants=ACTIVATE


Los proyectos C ++ (y las soluciones) no están (¿todavía?) Integrados en el entorno MSBuild. Como parte del proceso de compilación, se llama a la tarea VCBuild , que es solo una envoltura alrededor de vcbuild.exe .

Tú podrías :

  • cree una configuración específica para su solución donde se definirá ACTIVATE=1 , y compile con devenv.exe (con el modificador / ProjectConfig ).
  • crea tu propio archivo de destino para envolver tu propia llamada a la tarea VCBuild (mira el parámetro Override) ...
  • use vcbuild.exe en lugar de msbuild.exe. (vcbuild.exe no parece tener el equivalente de un parámetro Override).

Tenga en cuenta que su solución no funcionaría para proyectos de C #, a menos que haya ajustado un poco los archivos de su proyecto. Como referencia, aquí es cómo haría esto:

  • Agregue el siguiente código antes de la llamada a <Import Project="$(MSBuildBinPath)/Microsoft.CSharp.targets" /> :

<PropertyGroup Condition=" ''$(MyConstants)'' != '''' "> <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> </PropertyGroup>

  • Llame a MSBuild así:

msbuild /p:MyConstants="ACTIVATE=1"


Probablemente debería ser:

#ifdef ACTIVATE # pragma message( "Activated" ) #else # pragma message( "Not Activated") #endif


Necesitaba hacer esto también, necesitaba poder crear dos versiones diferentes de mi aplicación y quería poder crear la compilación usando VCBUILD. VCBUILD tiene el modificador de línea de comando / override, pero no estoy seguro de que se pueda usar para modificar #define symbols que luego se pueden probar usando #if compilación condicional.

La solución con la que me levanté fue escribir una utilidad simple para crear un archivo de cabecera que # definiera el símbolo en función del estado de una variable de entorno y ejecutar la utilidad desde un paso previo a la construcción. Antes de cada ejecución del paso VCBUILD, el script establece la variable de entorno y "toca" un archivo en la aplicación para garantizar que se ejecuta el paso de prebuild.

Sí, es un truco feo, pero fue lo mejor que pude encontrar.


Llego un poco tarde a la fiesta (solo 4 años más o menos), pero tuve que resolver este problema en un proyecto y me encontré con esta pregunta mientras buscaba una solución. Nuestra solución fue usar una variable de entorno combinada con el cuadro Opciones adicionales en Visual Studio.

  1. En Visual Studio, agregue una macro variable de entorno, $ (ExternalCompilerOptions), a las Opciones adicionales en las opciones del proyecto-> C / C ++ -> Línea de comando (recuerde las configuraciones tanto de depuración como de liberación)
  2. Establezca la variable de entorno antes de llamar a msbuild

    c:> establecer ExternalCompilerOptions = / DFOO / DBAR
    c:> msbuild

El ítem n. ° 1 se ve así en el archivo vcxproj:

<ClCompile> <AdditionalOptions>$(ExternalCompilerOptions) ... </AdditionalOptions> </ClCompile>

Esto funciona para mí con VS 2010. Impulsamos msbuild desde varios scripts de compilación, por lo que la fealdad se oculta un poco. Tenga en cuenta que no he probado si esto funciona cuando necesita establecer la definición de valor específico (/ DACTIVATE = 1). Creo que funcionaría, pero me preocupa tener múltiples ''='' allí.

H ^ 2


Si necesita definir alguna constante (no solo verdadera / falsa), puede hacerlo de la siguiente manera:

En línea de comando:

MSBuild /p:MyDefine=MyValue

En el archivo vcxproj (en la sección <ClCompile> y / o <ResourceCompile>, dependiendo de dónde lo necesite):

<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions>


Para VS2010 y versiones posteriores, consulte mi respuesta aquí para obtener una solución que no requiere modificación del archivo de proyecto original.


Como @ bigh_29 ha mencionado, usando variables de entorno para definir o indefinir un preprocesador.

Lo que sugirió la forma de definir un preprocesador es en realidad / U ACTIVAR.

De esta forma, cualquier preprocesador que coincida con ACTIVATE será negado y el compilador no pasará por su #if ACTIVATE #endif enclosure.