msbuild:在命令行中设置一个特定的预处理器#define

ace*_*mtp 21 c++ msbuild visual-studio

在C++文件中,我有一个这样的代码:

#if ACTIVATE
#   pragma message( "Activated" )
#else
#   pragma message( "Not Activated")
#endif
Run Code Online (Sandbox Code Playgroud)

我想使用msbuild命令行将此ACTIVE定义设置为1.

它尝试了这个,但它不起作用:

msbuild /p:DefineConstants="ACTIVATE=1"
Run Code Online (Sandbox Code Playgroud)

任何的想法?

big*_*_29 26

我参加派对有点晚了(仅仅4年左右),但我只是不得不在一个项目上解决这个问题,并在搜索解决方案时偶然发现了这个问题.我们的解决方案是在Visual Studio中使用环境变量和附加选项框.

  1. 在Visual Studio中,将环境变量宏$(ExternalCompilerOptions)添加到项目选项 - > C/C++ - >命令行下的其他选项(记住调试和发布配置)
  2. 在调用msbuild之前设置环境变量

    c:>设置ExternalCompilerOptions =/DFOO/DBAR
    c:> msbuild

项目#1最终在vcxproj文件中看起来像这样:

    c:\> set ExternalCompilerOptions=/DFOO /DBAR 
    c:\> msbuild
Run Code Online (Sandbox Code Playgroud)

这适用于VS 2010.我们从各种构建脚本驱动msbuild,因此丑陋隐藏了一点.请注意,当您需要将define设置为特定值(/ DACTIVATE = 1)时,我还没有测试它是否有效.我认为它会起作用,但我担心在那里有多个'='.

H ^ 2


Mac*_*Mac 9

C++项目(和解决方案)还没有(但是?)集成在MSBuild环境中.作为构建过程的一部分,调用VCBuild任务,它只是vcbuild.exe的包装器.

你可以 :

  • 为您的解决方案创建一个特定的配置ACTIVATE=1,然后使用devenv.exe(使用/ ProjectConfig开关)对其进行编译.
  • 创建自己的目标文件以包装您自己对VCBuild任务的调用(请参阅Override参数)...
  • 使用vcbuild.exe而不是msbuild.exe.(vcbuild.exe似乎没有等效的Override参数).

请注意,除非您稍微调整项目文件,否则您的解决方案将无法用于C#项目.作为参考,这是我将如何做到这一点:

  • 在调用之前添加以下代码<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />:
<PropertyGroup Condition=" '$(MyConstants)' != '' ">
  <DefineConstants>$(DefineConstants);$(MyConstants)</DefineConstants>
</PropertyGroup>
  • 像这样调用MSBuild:
msbuild /p:MyConstants="ACTIVATE=1"


Mat*_*lls 8

我想你想要:

/p:DefineConstants=ACTIVATE
Run Code Online (Sandbox Code Playgroud)

  • @Matt,我提出了相同的答案,并且有两名评论者告诉我这行不通。因此,我删除了答案,以便其他具有MSBuild经验的人可能会提出一些想法。 (2认同)
  • 看起来这会覆盖 .csproj 文件中定义的常量 (2认同)

4Le*_*Cat 7

如果需要定义一些常量(不仅仅是true/false),可以通过以下方式实现:

在命令行上:

MSBuild /p:MyDefine=MyValue
Run Code Online (Sandbox Code Playgroud)

在vcxproj文件中(在<ClCompile>和/或<ResourceCompile>部分中,取决于您需要它的位置):

<PreprocessorDefinitions>MY_DEFINE=$(MyDefine);$(PreprocessorDefinitions)</PreprocessorDefinitions>
Run Code Online (Sandbox Code Playgroud)


小智 5

使用 CL 环境变量定义预处理器宏

在调用 MSBUILD 之前,只需使用 '/D' 选项设置环境变量 'CL',如下所示:

set CL=/DACTIVATE 定义激活

您可以使用“#”符号替换“=”符号

set CL=/DACTIVATE#1 将定义 ACTIVATE=1

然后调用 MSBUILD

有关 CL 环境变量的更多文档,请访问:https : //msdn.microsoft.com/en-us/library/kezkeayy(v=vs.140).aspx


ace*_*mtp -5

思考的答案是:你不能