如何使用 msbuild 禁用预编译 headers?

How to disable precompiled headers with msbuild?

问题

问题

如何告诉msbuild.exe不要使用预编译headers?

备注

我尝试在 msbuild 调用中添加 /Y-,但它不是 msbuild 的有效参数。

We can't directly do this by msbuild since PrecompiledHeader is not a msbuild property...

MSbuild 从项目文件中读取数据以执行构建。 xx.vcxproj中有几个元素可以在命令行中指定,比如targets, properties,所以我们可以使用像msbuild xx.vcxproj/xx.sln /t:xx /p:xx这样的命令在命令行中构建时指定 target 元素和 property 元素。

例如: msbuild xx.vcxproj /t:build /p:OutDir=xxx 可以指定输出程序集的位置。

我换了一个VS2015C++ project's settings让它不用precompiled headers,比较了两个版本[=65=的区别(用git做版本控制) ] 我找到的文件:

所以控制预编译头行为的元素是一个Item metadata in ClCompile Item。由于元素是 Item metadata 而不是 property,我们 不能 使用像 msbuild xx.vcxproj /p:PrecompiledHeader=NotUsing ... 这样的命令来禁用预编译头文件。 (/p <=> /property)

可能的方向:

我能想到的唯一可能有助于实现您的目标的方向是创建自定义 属性 来控制此行为。

1.For一个普通的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.Add 自定义 DisablePCH 属性,将这四个 ItemDefinitionGroups 制作成 copy 并将此 属性 纳入他们的 Condition.

<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.Then 默认情况下,如果我们使用像 msbuild xx.vcxproj ... 这样的普通命令,它将使用预编译头文件。如果我们想在命令中禁用它,请使用像 msbuild xx.vcxproj /p:DisablePCH=true ... 这样的命令。

ps:如果你确实想通过 msbuild 禁用 PCH(预编译头文件),你可以尝试 possible direction,出于某种原因我无法在我的机器上测试它: (。请随时告诉我它是否有用ps。