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步骤之前,脚本会设置环境变量并"触摸"应用程序中的文件以确保执行预构建步骤。
是的,这是一个丑陋的骇客,但这是我能想到的最好的办法!