我目前正在尝试使用
#ifdef
标签在 Visual C++ .rc 文件中的几个不同的默认图标之间切换。
使用 MSBuild 通过命令行创建切换 #define 值的构建。
我遇到的困难是,使用 Visual Studio 2010,为了将预处理器定义传递给资源编译器,您必须在项目设置中定义它(配置属性 -> 资源 -> 常规)。
这使得使用
#ifdef
标签变得困难,因为使用此方法它将始终在资源编译器中定义。
我很想将其定义为一个值,这样我就可以使用预处理器
#if SOMEVALUE == 4
可能会工作,但似乎无法找到通过命令行将预处理器定义+值传递给MSBuild的方法。
有谁知道如何将预处理器定义直接传递到资源编译器,或者通过 msbuild 命令行为预处理器定义定义值?
是的,这是可以做到的。
尝试使用环境变量将值传递到构建过程中。
在项目属性中,将 ;$(CMDLINE_DEFINES) 添加到资源预处理器定义的末尾。 (一定要选择正确的配置。)
然后,当您从命令行使用 MSBuild 时,键入(或添加到批处理文件中)...
cd C:\Projects\SomeProject
set CMDLINE_DEFINES=SOMETEST=42
MSBuild SomeProject.vcproj
批处理文件可能如下所示:
@echo off
SET CMDLINE_DEFINES=%1
MSBUILD SomeProject.vcproj
使用此批处理文件,您在命令行上传递的任何内容都将作为预处理器宏传递到构建过程。
请参阅this的答案,以及设置 ResourceCompile 选项的附加步骤,即在文本编辑器中编辑项目文件以包含如下元素:
<ItemDefinitionGroup>
<ClCompile>
<AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
</ClCompile>
<ResourceCompile>
<AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
</ResourceCompile>
</ItemDefinitionGroup>
我遇到的困难是,使用 Visual Studio 2010,为了将预处理器定义传递给资源编译器,您必须在项目设置中定义它(配置属性 -> 资源 -> 常规)。
你遇到了最困难的部分。只需输入定义为
TESTAPPLE=15
,它将对整个项目有效 #define TESTAPPLE 15
。
虽然这是一个老问题,但对于现在的任何参考,以下步骤对我有用:
msbuild
在 /p
命令行中传递变量 = 基础值,例如 msbuild my_solution.sln /p:ENVSOMEVALUE="4"
my_proj.vcxproj
中,将变量定义为资源编译器的预处理器定义,并将其分配给从msbuild
传递的变量,例如在 <Project></Project>
中添加以下部分: <ItemDefinitionGroup>
<ResourceCompile>
<PreprocessorDefinitions>
SOMEVALUE=$(ENVSOMEVALUE);
%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
.rc
文件中,按照您喜欢的方式使用代码:#if SOMEVALUE == 4
如果不是从
msbuild
传递(例如从 Visual Studio IDE 构建),您可能需要为定义设置默认值,在这种情况下,您可以在项目文件中使用条件 manually,例如
<ItemDefinitionGroup Condition="'$(ENVSOMEVALUE)'!=''">
<ResourceCompile>
<PreprocessorDefinitions>
SOMEVALUE=$(ENVSOMEVALUE);
%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(ENVSOMEVALUE)'==''">
<ResourceCompile>
<PreprocessorDefinitions>
SOMEVALUE=1; <!-- Default Value -->
%(PreprocessorDefinitions)</PreprocessorDefinitions>
</ResourceCompile>
</ItemDefinitionGroup>