2011-08-22 78 views
3

我正在尝试使用#ifdef标记在Visual C++ .rc文件中的几个不同的默认图标之间切换。我可以通过命令行将预处理器定义传递给资源编译器吗?

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

我遇到的困难是使用Visual Studio 2010为了将预处理器定义传递给资源编译器,必须在项目设置(配置属性 - >资源 - >常规)中定义它。

这使得难以使用#ifdef标签,因为使用这种方法它总是会在资源编译器中定义。

我很想将其定义为一个值,以便我可以使用预处理器#if SOMEVALUE == 4可能会工作,但似乎无法找到一种方法将预处理器定义+值通过命令行传递给MSBuild。

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

回答

1

我遇到的困难是使用Visual Studio 2010为了将预处理器定义传递给资源编译器,必须在项目设置(配置属性 - >资源 - >常规)中定义它。

你有困难的部分。只需输入定义为TESTAPPLE=15,并且它将有效地为整个项目#define TESTAPPLE 15

+1

不幸的是要传递的#define值项目编译器不会传递给资源编译器。即,编译项目时,“/ T”TESTAPPLE = 15“将TESTAPPLE设置为值15.但是,在资源编译器中,TESTAPPLE刚刚定义,但不具有值15. – Maixy

+0

huh,guess I haven没有足够的资源编译器。 http://www.cmake.org/pipermail/cmake/2011-January/042093.html暗示它可以运行'/ d“CMAKE_INTDIR = \”Release \“”',但不是授权源。 –

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

查看答案this,与建立ResourceCompile选项的额外步骤,即编辑您的项目文件在文本编辑器,包括这样的内容:

<ItemDefinitionGroup> 
    <ClCompile> 
     <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions> 
    </ClCompile> 
    <ResourceCompile> 
     <AdditionalOptions>/DERROR_LOG_LEVEL=5 %(AdditionalOptions)</AdditionalOptions> 
    </ResourceCompile> 
</ItemDefinitionGroup> 
相关问题