2008-10-03 16 views

Respuesta

-2

La respuesta es: NO PUEDE

+0

Encogiéndose de hombros, tal vez no lo haga en C++, pero la respuesta de Matt Howells funcionó para mí con un proyecto de C#. No se puede pensar en ninguna razón por la que no funcionaría en C++. – blak3r

+0

Esta respuesta aceptada es tan profunda que ni siquiera puedo verla. –

+0

@ blak3r La respuesta de Matts no funciona en C++ y esta pregunta es específicamente sobre C++. Y parece que no hay forma de hacerlo con solo agregar indicadores en la línea de comandos sin cambios adicionales en el archivo de proyecto u otro archivo externo. – Zitrax

7

Creo que desee:

/p:DefineConstants=ACTIVATE 
+1

@ Matt, sugerí la misma respuesta y me dijeron por dos comentaristas de que esto no funciona. así que he borrado mi respuesta para que otros con más experiencia con MSBuild podrían ofrecer ideas. –

+0

Ah, y acemtp me dijo que ya lo intentó y lo hizo no funciona –

+0

Bueno, funciona bien en C# de todos modos ... –

-1

probablemente debería ser:

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

@ rdeml - buena idea. –

+1

No, no es #ifdef, es un #if Y, de todos modos, tampoco funciona con #ifdef – acemtp

8

C++ proyectos (y soluciones) no son (todavía?) Integrados en el entorno de MSBuild. Como parte del proceso de compilación, se llama al VCBuild task, que es solo un contenedor alrededor del vcbuild.exe.

Usted podría:

  • crear una configuración específica para su solución en la que se definiría ACTIVATE=1, y compilarlo con devenv.exe (con el interruptor /ProjectConfig).
  • crear su propio archivo de destino para envolver su propia llamada a la VCBuild task (ver el parámetro de anulación) ...
  • VCBuild.exe uso 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 C#, a menos que haya ajustado un poco los archivos de su proyecto. Para referencia, aquí es lo que me gustaría hacer esto:

  • añada el siguiente código antes de la llamada a <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />:
<PropertyGroup Condition=" '$(MyConstants)' != '' "> 
    <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants> 
</PropertyGroup>
  • MSBuild llamada así:
msbuild /p:MyConstants="ACTIVATE=1"
+0

Puedo usar vcbuild.exe en lugar de msbuild.exe, pero la pregunta es la misma. ¿Cómo establecer un preprocesador específico en la línea de comandos de vcbuild? – acemtp

+0

Tiene razón: asumí erróneamente que vcbuild.exe tenía el mismo conjunto de parámetros que la tarea VCBuild. Respuesta actualizada – Mac

+0

+1 para el parche Project-Script – quetzalcoatl

0

Necesitaba hacer esto también: era necesario para poder compilar dos versiones diferentes de mi aplicación y quería poder guiar 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 los símbolos #define 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 hack feo, pero fue lo mejor que pude encontrar.

23

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 tropecé 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, añadir una macro variable de entorno, $ (ExternalCompilerOptions), a las opciones adicionales bajo el proyecto opciones-> C/C++ -> línea de comandos (recuerda tanto de depuración y liberación configuraciones)
  2. Conjunto la variable de entorno antes de llamar msbuild

    C:> conjunto ExternalCompilerOptions =/DFOO/dbar
    c:> msbuild

artículo # 1 extremos pareciéndose a esto en el archivo vcxproj:

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

Esto funciona para mí con VS 2010. Nos dirigimos msbuild de varios guiones de construcción, por lo que la fealdad se esconde 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

+0

Gracias por la última respuesta :) – acemtp

+0

Para establecer las definiciones al compilar archivos de recursos, también configure las Opciones adicionales en Propiedades de configuración -> Recursos -> Línea de comando – Rado

7

Si es necesario definir una constante (no sólo verdadero/falso), puede hacerlo de la siguiente manera:

En la línea de comandos:

MSBuild /p:MyDefine=MyValue 

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

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

Para VS2010 en adelante, consulte mi respuesta here para obtener una solución que no requiere modificación del archivo de proyecto original.

0

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

Lo que sugirió la manera de indefinir un preprocesador es realmente /U ACTIVAR.

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

0

Quizás es una mala idea responder a una pregunta tan antigua, pero recientemente busqué en Google un problema similar y encontré este tema. Escribí un script cmd para algún sistema de compilación y tuve éxito en encontrar una solución.Lo dejo aquí para las generaciones futuras (:

Según problema de @ acemtp, mi solución sería el siguiente:

@echo off 

:: it is considered that Visual Studio tools are in the PATH 
if "%1"=="USE_ACTIVATE_MACRO" (
    :: if parameter USE_ACTIVATE_MACRO is passed to script 
    :: the macro ACTIVATE will be defined for the project 
    set CL=/DACTIVATE#1 
) 
call msbuild /t:Rebuild /p:Configuration=Release 

UPD: He intentado utilizar set CL=/DACTIVATE=1 y también trabajado, pero el official documentation recomienda a utilizar signo de número

Cuestiones relacionadas