Мы не можем напрямую сделать это с помощью msbuild, поскольку PrecompiledHeader
не является свойством msbuild ...
MSbuild считывает данные из файла проекта для выполнения сборки. И в xx.vcxproj
есть несколько элементов, которые можно указывать в командной строке, например target , properties , поэтому мы можем использовать команду, например msbuild xx.vcxproj / xx.sln / t: xx / p: xx для указания элемента target
и property
при сборке в командной строке.
например, : msbuild xx.vcxproj /t:build /p:OutDir=xxx
может указать, куда вывести свою сборку.
Я изменил один из параметров проекта VS2015 C ++ , чтобы он не использовал precompiled headers
, после сравнения различий (с помощью git для контроля версий) между двумя версиями файла xx.vcxproj Iнайдено:
![enter image description here](https://i.stack.imgur.com/uKA2C.png)
Таким образом, элемент для управления поведением precompiled-header является Метаданные элемента в ClCompile
Пункт . Поскольку элемент является Item metadata
вместо property
, мы не можем использовать команду типа msbuild xx.vcxproj /p:PrecompiledHeader=NotUsing ...
для отключения предварительно скомпилированных заголовков. (/p
<=> /property
)
Возможное направление:
Единственное возможное направление, которое я могу себе представить, которое может работать для достижения ваших целей, - это создание собственногосвойство для управления этим поведением.
1.Для обычного проекта C ++ содержимое его файла проекта:
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
2.Добавьте пользовательское свойство DisablePCH
, сделайте copy
из этих четырех ItemDefinitionGroups
и включите это свойство в их Условие .
<PropertyGroup>
<DisablePCH>false</DisablePCH>
</PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='false'">
<ClCompile>
<PrecompiledHeader>Use</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64' And '$(DisablePCH)'=='true'">
<ClCompile>
<PrecompiledHeader>NotUsing</PrecompiledHeader>
...
</ClCompile>
</ItemDefinitionGroup>
3. Затем по умолчанию, если мы используем обычную команду, такую как msbuild xx.vcxproj ...
, она будет использоватьprecompiledheaders. Если мы хотим отключить это в команде, используйте команду как msbuild xx.vcxproj /p:DisablePCH=true ...
.
ps: Если вы хотите отключить PCH (предварительно скомпилированные заголовки) с помощью msbuild, вы можете попробовать possible direction
, по какой-то причине я не могу проверить его на своем компьютере :(. Не стесняйтесьдайте мне знать, если это помогает или нет.