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

时间:2020-03-06 15:04:15  来源:igfitidea点击:

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

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

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

它尝试过此方法,但不起作用:

msbuild /p:DefineConstants="ACTIVATE=1"

任何的想法?

解决方案

我想你要:

/p:DefineConstants=ACTIVATE

它可能应该是:

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

C ++项目(和解决方案)尚未(尚未?)集成在MSBuild环境中。作为构建过程的一部分,将调用VCBuild任务,该任务只是vcbuild.exe的包装。

你可以 :

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

请注意,除非我们稍稍调整了项目文件,否则解决方案也不适用于Cprojects。供参考,这是我将如何执行此操作:

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

答案是:你不能

我还需要这样做,以便能够构建我的应用程序的两个不同版本,并希望能够使用VCBUILD编写脚本。 VCBUILD确实具有/ override命令行开关,但是我不确定它是否可以用于修改#define符号,然后可以使用#if条件编译对其进行测试。

我提出的解决方案是编写一个简单的实用程序,以创建一个头文件,该文件根据环境变量的状态#defined定义该符号,并从预构建步骤运行该实用程序。在每次执行VCBUILD步骤之前,脚本会设置环境变量并"触摸"应用程序中的文件以确保执行预构建步骤。

是的,这是一个丑陋的骇客,但这是我能想到的最好的办法!