我可以通过命令行将预处理器定义传递给资源编译器吗?

时间:2011-08-22 15:12:10

标签: c++ visual-studio-2010 msbuild c-preprocessor rc

我目前正在尝试使用#ifdef标记在Visual C ++ .rc文件中切换几个不同的默认图标。

使用MSBuild通过命令行创建切换#define值的构建。

我遇到的困难是使用Visual Studio 2010,为了将预处理器定义传递给资源编译器,您必须在项目设置中定义它(Config Properties - > Resources - > General)。 / p>

这使得使用#ifdef标记变得困难,因为使用此方法始终会在资源编译器中定义它。

我希望将它定义为一个值,以便我可以使用预处理器#if SOMEVALUE == 4可能有效,但似乎找不到通过命令行将预处理器定义+值传递给MSBuild的方法。 / p>

有没有人知道将预处理器定义直接传递给资源编译器的方法,或者通过命令行为msbuild定义预处理器定义的值的方法?

3 个答案:

答案 0 :(得分:5)

是的,这可以做到。

尝试使用环境变量将值传递到构建过程中。

在项目属性中,将$(CMDLINE_DEFINES)添加到资源预处理器定义的末尾。 (务必选择正确的配置。)

然后从命令行类型使用MSBuild(或添加到批处理文件)...

C:\Projects\SomeProject> set CMDLINE_DEFINES=SOMETEST=42
C:\Projects\SomeProject> MSBuild SomeProject.vcproj

批处理文件可能如下所示:

@echo off
SET CMDLINE_DEFINES=%1
MSBUILD SomeProject.vcproj

使用此批处理文件,无论您在命令行上传递什么,都将作为预处理器宏传递给构建过程。

答案 1 :(得分:1)

  

我遇到的困难是使用Visual Studio 2010,为了将预处理器定义传递给资源编译器,您必须在项目设置中定义它(Config Properties - > Resources - > General)。 / p>

你遇到了困难。只需输入定义为TESTAPPLE=15,它就会有效#define TESTAPPLE 15整个项目。

答案 2 :(得分:1)

请参阅this的答案,以及设置ResourceCompile选项的附加步骤,即在文本编辑器中编辑项目文件以包含以下元素:

<ItemDefinitionGroup>
    <ClCompile>
        <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
    </ClCompile>
    <ResourceCompile>
        <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions>
    </ResourceCompile>
</ItemDefinitionGroup>