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

问题描述 投票:0回答:4

我目前正在尝试使用

#ifdef
标签在 Visual C++ .rc 文件中的几个不同的默认图标之间切换。

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

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

这使得使用

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

我很想将其定义为一个值,这样我就可以使用预处理器

#if SOMEVALUE == 4
可能会工作,但似乎无法找到通过命令行将预处理器定义+值传递给MSBuild的方法。

有谁知道如何将预处理器定义直接传递到资源编译器,或者通过 msbuild 命令行为预处理器定义定义值?

c++ visual-studio-2010 msbuild c-preprocessor rc
4个回答
7
投票

是的,这是可以做到的。

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

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

然后,当您从命令行使用 MSBuild 时,键入(或添加到批处理文件中)...

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

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

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

使用此批处理文件,您在命令行上传递的任何内容都将作为预处理器宏传递到构建过程。


2
投票

请参阅this的答案,以及设置 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,为了将预处理器定义传递给资源编译器,您必须在项目设置中定义它(配置属性 -> 资源 -> 常规)。

你遇到了最困难的部分。只需输入定义为

TESTAPPLE=15
,它将对整个项目有效
#define TESTAPPLE 15


0
投票

虽然这是一个老问题,但对于现在的任何参考,以下步骤对我有用:

  1. 使用
    msbuild
    /p
    命令行中传递变量 = 基础值,例如
msbuild my_solution.sln /p:ENVSOMEVALUE="4"
  1. 在项目文件
    my_proj.vcxproj
    中,将变量定义为资源编译器的预处理器定义,并将其分配给从
    msbuild
    传递的变量,例如在
    <Project></Project>
    中添加以下部分:
  <ItemDefinitionGroup>
    <ResourceCompile>
      <PreprocessorDefinitions>
        SOMEVALUE=$(ENVSOMEVALUE);
        %(PreprocessorDefinitions)</PreprocessorDefinitions>
    </ResourceCompile>
  </ItemDefinitionGroup>

  1. .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>  
© www.soinside.com 2019 - 2024. All rights reserved.