如何使用msbuild禁用预编译的标头?

时间:2019-10-21 22:36:39

标签: visual-studio msbuild precompiled-headers

问题

  • 我有一个使用预编译标头的VS2015解决方案。
  • 我们的持续集成服务器使用msbuild构建解决方案。
  • 我们还使用了覆盖工具,该工具在预编译的标头方面存在一些问题。

问题

如何告诉msbuild.exe不要使用预编译的标头?

注意

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

1 个答案:

答案 0 :(得分:1)

  

由于PrecompiledHeader不是msbuild属性,因此我们无法通过msbuild直接执行此操作...

MSbuild从项目文件中读取数据以执行构建。 xx.vcxproj中有几个元素可以在命令行中指定,例如targetsproperties,因此我们可以使用msbuild xx.vcxproj / xx.sln / t:xx之类的命令/ p:xx,以在命令行中进行构建时指定target元素和property元素。

例如msbuild xx.vcxproj /t:build /p:OutDir=xxx可以指定将程序集输出到何处。

在比较了两个我发现的xx.vcxproj文件的两个版本之间的差异(使用git进行版本控制)后,我更改了一个VS2015 C++ project's settings以使其不使用precompiled headers

enter image description here

因此,用于控制预编译头行为的元素是ClCompile Item metadata中的Item。由于元素是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,并将该属性纳入其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。然后默认情况下,如果我们使用普通命令,例如msbuild xx.vcxproj ...,它将使用预编译头文件。如果要在命令中禁用它,请使用msbuild xx.vcxproj /p:DisablePCH=true ...之类的命令。

ps:如果您确实想通过msbuild禁用PCH(预编译头),则可以尝试使用possible direction,由于某些原因,我无法在我的机器上对其进行测试:(。我知道这是否有帮助。