msbuild: set a specific preprocessor #define in the command line

后端 未结 11 1632
借酒劲吻你
借酒劲吻你 2021-02-01 05:08

In a C++ file, I have a code like this:

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

I

相关标签:
11条回答
  • 2021-02-01 05:31

    It should probably be:

    #ifdef ACTIVATE
    #   pragma message( "Activated" )
    #else
    #   pragma message( "Not Activated")
    #endif
    
    0 讨论(0)
  • 2021-02-01 05:35

    I'm a little late to the party (only 4 years or so), but I just had to workaround this problem on a project, and stumbled across this question while searching for a fix. Our solution was to use an environment variable with /D defines in it, combined with the Additional Options box in visual studio.

    1. In Visual Studio, add an environment variable macro, $(ExternalCompilerOptions), to the Additional Options under project options->C/C++->Command Line (remember both Debug and Release configs)
    2. Set the environment variable prior to calling msbuild. Use the /D compiler option to define your macros
        c:\> set ExternalCompilerOptions=/DFOO /DBAR 
        c:\> msbuild
    

    Item #1 ends up looking like this in the vcxproj file:

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

    This works for me with VS 2010. We drive msbuild from various build scripts, so the environment variable ugliness is hidden a bit. Note that I have not tested if this works when you need to set the define to specific value ( /DACTIVATE=1 ). I think it would work, but I'm concerned about having multiple '='s in there.

    H^2

    0 讨论(0)
  • 2021-02-01 05:36

    As @bigh_29 has mentioned, using environment variables to define or undefine a preprocessor.

    What he suggested the way to undefine a preprocessor is actually /UACTIVATE.

    This way, any preprocessor matching ACTIVATE will be negated and compiler wouldn't go through your #if ACTIVATE #endif enclosure.

    0 讨论(0)
  • 2021-02-01 05:38

    I needed to do this too - needed to be able to build two different versions of my app and wanted to be able to script the build using VCBUILD. VCBUILD does have the /override command line switch, but I am not sure it can be used to modify #define symbols that can then be tested using #if conditional compilation.

    The solution I cam up with was to write a simple utility to create a header file that #defined the symbol based on the state of an environment variable and run the utility from a pre-build step. Prior to each execution of the VCBUILD step the script sets the environment variable and "touches" a file in the app to ensure that the prebuild step is executed.

    Yes, it is an ugly hack, but it was the best I could come up with!

    0 讨论(0)
  • 2021-02-01 05:45

    Maybe it is a bad idea to answer such old question, but recently I googled a similar problem and found this topic. I wrote a cmd script for some build system and I was succeed to find a solution. I leave it here for future generations (:

    According to @acemtp's problem, my solution would look like this:

    @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: I tried to use set CL=/DACTIVATE=1 and it also worked, but the official documentation recommends to use number sign

    0 讨论(0)
提交回复
热议问题