我使用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|
1条答案
按热度按时间gg58donl1#
我使用以下小测试文件进行了测试:
示例命令和输出:
| | 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)
时,应该是:但是在项目的某个地方,正在添加引号。是否有您没有显示的修改
DefineConstants
属性的代码?