我正在使用 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
?
到目前为止我尝试过的事情总结:
命令行 |
结果在 命令行 |
评论 |
---|---|---|
|
|
错误:没有拆分成多个
|
|
|
错误:拆分,但包含
|
|
无/一 | 错误:属性无效 |
我用以下小测试文件进行了测试:
<Project>
<Target Name="TestProp">
<Message Text="$(DefineConstants)" />
</Target>
</Project>
示例命令和输出:
MSBuild 命令 | 输出 | 评论 | |
---|---|---|---|
1 |
|
MSB1006 错误 | |
2 |
|
酒吧 | |
3 |
|
酒吧 | |
4 |
|
FOO;酒吧 | |
5 |
|
FOO;酒吧 | |
6 |
|
FOO;酒吧 |
/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
属性?