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

7

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

使用MSBuild通过命令行创建构建版本,并切换#define值。

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

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

我希望将其定义为一个值,这样我就可以使用预处理器#if SOMEVALUE == 4,但似乎找不到一种通过命令行向MSBuild直接传递预处理器定义+值的方法。

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

4个回答

7

是的,这可以做到。

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

在项目属性中,将 ;$(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

使用这个批处理文件,无论你在命令行中传递什么参数,都将作为预处理宏参数传递给构建过程。

2

请参考 这里 的答案,并额外设置ResourceCompile选项,即在文本编辑器中编辑您的项目文件以包含以下元素:

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

2

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

你已经解决了难题。只需输入定义 TESTAPPLE=15,它就会有效地为整个项目定义 #define TESTAPPLE 15


1
不幸的是,传递给项目编译器的 #define 值无法传递到资源编译器。例如,在编译项目时使用 /D "TESTAPPLE=15" 将 TESTAPPLE 设置为 15。但是,在资源编译器中,TESTAPPLE 只被定义,但没有数值 15。 - Maixy
哎呀,看来我还没有好好玩过资源编译器。http://www.cmake.org/pipermail/cmake/2011-January/042093.html 暗示它可以使用 /d "CMAKE_INTDIR=\"Release\"",但并不是权威来源。 - Mooing Duck

0
尽管这是一个老问题,但对于任何参考,以下步骤现在适用于我:
  1. 使用 /pmsbuild 命令行中传递变量 = 底层值,例如:
msbuild my_solution.sln /p:ENVSOMEVALUE="4"

在项目文件my_proj.vcxproj中,将该变量定义为资源编译器的预处理器定义,并将其分配给从msbuild传递的变量,例如在<Project></Project>内添加以下部分:
  <ItemDefinitionGroup>
    <ResourceCompile>
      <PreprocessorDefinitions>
        SOMEVALUE=$(ENVSOMEVALUE);
        %(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ResourceCompile>
  </ItemDefinitionGroup>

  1. .rc 文件中,按照您喜欢的方式使用代码:
#if SOMEVALUE == 4 

如果从msbuild(例如从Visual Studio IDE构建)未传递定义,则可能需要为该定义设置默认值,在这种情况下,您可以在项目文件中手动使用条件,例如:

  <ItemDefinitionGroup  Condition="'$(ENVSOMEVALUE)'!=''">
    <ResourceCompile>
      <PreprocessorDefinitions>
        SOMEVALUE=$(ENVSOMEVALUE);
        %(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ResourceCompile>
  </ItemDefinitionGroup>  
  <ItemDefinitionGroup  Condition="'$(ENVSOMEVALUE)'==''">
    <ResourceCompile>
      <PreprocessorDefinitions>
        SOMEVALUE=1; <!-- Default Value -->
        %(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ResourceCompile>
  </ItemDefinitionGroup>  

你尝试过直接赋值变量吗 - msbuild my_solution.sln /p:SOMEVALUE=4 - AntonK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接