问题
msbuild
构建解决方案。 问题
如何告诉msbuild.exe
不要使用预编译的标头?
注意
我尝试在/Y-
调用中添加msbuild
,但这不是msbuild
的有效参数。
答案 0 :(得分:1)
由于
PrecompiledHeader
不是msbuild属性,因此我们无法通过msbuild直接执行此操作...
MSbuild从项目文件中读取数据以执行构建。 xx.vcxproj
中有几个元素可以在命令行中指定,例如targets,properties,因此我们可以使用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
:
因此,用于控制预编译头行为的元素是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
,由于某些原因,我无法在我的机器上对其进行测试:(。我知道这是否有帮助。