Visual Studio 在PreprocessorDefinitions的VS项目文件中用分号展开变量

beq87vna  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(242)

我使用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|不适用|错误:property not valid|

gg58donl

gg58donl1#

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

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

示例命令和输出:
| | MSBuild命令|输出|评论|
| --------------|--------------|--------------|--------------|
| 1| msbuild test.proj /p:DefineConstants=FOO;BAR||MSB 1006错误|
| 二|msbuild test.proj /p:DefineConstants=FOO;DefineConstants=BAR| BAR||
| 三|msbuild test.proj /p:DefineConstants=FOO,DefineConstants=BAR| BAR||
| 四个|msbuild test.proj /p:DefineConstants="FOO;BAR"|杆||
| 五|msbuild test.proj /p:"DefineConstants=FOO;BAR"|杆||
| 六|msbuild test.proj /p:DefineConstants=FOO%3BBAR|杆||
MSBuild的/property开关(简称/p)定义了一个MSBuild Property/property开关接受一个或多个以分号或逗号分隔的名称/值对。
示例1是一个错误,因为开关在分号后需要一个名称/值对。BAR要么是没有值的名称,要么是没有名称的值。
同一个名字可以出现多次。MSBuild只是重新定义了属性。基本上使用最后一个值。这就是例子2和3中所发生的事情。
示例4和5使用引号来表示分号是一个名称/值对的一部分。
例6是对分号进行十六进制编码。
请注意,在示例4、5和6中,DefineConstants属性的值不包含引号。
PreprocessorDefinitions中替换$(DefineConstants)时,应该是:

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

但是在项目的某个地方,正在添加引号。是否有您没有显示的修改DefineConstants属性的代码?

相关问题