Я попытался установить свойство MSBuild, но это не сработало. Как я могу сделать это с MSBuild?
См. Msbuild Глобальные свойства , командная строка получает только свойства msbuild, тогда как CallingConvention
не является свойством msbuild.
Я создал один проект C ++ и изменил /Gd to /Gr
в C/C++=>Advanced
в конфигурации Debug | X86, а затем я вижу что-то вроде этого:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
...
<CallingConvention>FastCall</CallingConvention>
</ClCompile>
<Link>
...
</Link>
</ItemDefinitionGroup>
Очевидно, что CallingConvention
это просто один Metadata
из Item
CLCompile
. Это не свойство msbuild. Поэтому мы не можем установить его в командной строке msbuild следующим образом: msbuild /p:xxx
.
Возможный обходной путь :
Так как единственная разница между использованием /Gr
и /Gd
- это строка метаданных:
Поэтому я думаю, что мы можем сделать одну копию этого ItemDefinitionGroup
в файле проекта и установить их условия например:
<!--ItemDefinitionGroup when using default /Gd-->
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' == ''">
<ClCompile>
...
</ClCompile>
...
</ItemDefinitionGroup>
<!--ItemDefinitionGroup when using /Gr-->
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' AND '$(UseFastCall)' != ''">
<ClCompile>
...
<CallingConvention>FastCall</CallingConvention> <!--The only difference here.-->
</ClCompile>
...
</ItemDefinitionGroup>
Затем, если мы передадим значение в пользовательское свойство UseFastCall
, например: MSBuild.exe /p:PlatformToolset=v141 /p:Platform=x86 /p:Configuration=Debug /p:UseFastCall=true
. Следует использовать метаданные /Gr
. И если мы не передадим значение этому свойству, оно будет использовать defaut /Gd
. Поэтому обходной путь - создать собственное свойство для управления этим поведением. (Это только для Debug | win32, возможно, вам придется изменить также и для других конфигураций.)