在预处理器定义的 VS 项目文件中用分号扩展变量

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

我正在使用 this idea 使用名为

$(DefineConstants)
.

的全局变量从命令行构建脚本注入预处理器定义

vcxproj 文件片段:

  <PropertyGroup Label="Globals">
    <DefineConstants></DefineConstants>
  </PropertyGroup>
...
  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
    <ClCompile>
      <PreprocessorDefinitions>$(DefineConstants);WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

我的脚本使用以下(删节)命令行启动

msbuild

msbuild.exe Solution.sln /p:DefineConstants=FOO%3BBAR

其中

FOO%3BBAR
是动态的,来自任意数量的用户提供的值。 (使用
%3B
作为分隔符来自 this thread 因为使用原始
;
字符会导致错误。)

但是编译器 (

cl
) 命令行显示
$(DefineConstants)
的整个值被放置在一个单独的
/D
开关中,而不是被分成多个。

ClCompile:
  CL.exe ... /D "FOO;BAR" /D WIN32 /D _WINDOWS

好像变量里面的分号没有展开。有没有办法让它产生

/D FOO /D BAR

到目前为止我尝试过的事情总结:

msbuild
命令行
结果在
cl
命令行
评论
/p:DefineConstants=FOO%3BBAR
/D "FOO;BAR"
错误:没有拆分成多个
/D
/p:DefineConstants="FOO;BAR"
/D "\"FOO" /D "BAR\""
错误:拆分,但包含
\"
/p:DefineConstants=FOO;BAR
无/一 错误:属性无效
visual-studio visual-c++ msbuild
1个回答
0
投票

我用以下小测试文件进行了测试:

<Project>
  <Target Name="TestProp">
    <Message Text="$(DefineConstants)" />
  </Target>
</Project>

示例命令和输出:

MSBuild 命令 输出 评论
1
msbuild test.proj /p:DefineConstants=FOO;BAR
MSB1006 错误
2
msbuild test.proj /p:DefineConstants=FOO;DefineConstants=BAR
酒吧
3
msbuild test.proj /p:DefineConstants=FOO,DefineConstants=BAR
酒吧
4
msbuild test.proj /p:DefineConstants="FOO;BAR"
FOO;酒吧
5
msbuild test.proj /p:"DefineConstants=FOO;BAR"
FOO;酒吧
6
msbuild test.proj /p:DefineConstants=FOO%3BBAR
FOO;酒吧

MSBuild 的

/property
开关(简短版本
/p
)定义了一个MSBuild 属性
/property
开关接受一个或多个由分号或逗号分隔的名称/值对。

示例 1 是错误的,因为开关需要分号后的名称/值对。

BAR
是没有值的名称或没有名称的值。

同一个名字可以出现多次。 MSBuild 只是重新定义了该属性。基本上使用最后一个值。这就是示例 2 和 3 中发生的情况。

示例 4 和 5 使用引号表示分号是一个名称/值对的一部分。

Example 6 是十六进制编码的分号。

请注意,在示例 4、5 和 6 中,

DefineConstants
属性的值不包括引号。

$(DefineConstants)
被替换为
PreprocessorDefinitions
它应该是:

      <PreprocessorDefinitions>FOO;BAR;WIN32;_WINDOWS;%(PreprocessorDefinitions)</PreprocessorDefinitions>

但是在您的项目中的某个地方,正在添加引号。是否有您未显示的代码,即修改

DefineConstants
属性?

© www.soinside.com 2019 - 2024. All rights reserved.