使用 MSVC 工具链进行并行编译的技巧

昨天和 vczh 在群内聊了下 MSVC 并行编译的事情,我本为验证他的说法,结果发现自己的配置缺少部分内容而无法充分并行编译。 虽然在自己的工具链已经做了相关补充,但为了让包括自己在内的更多人能有一个靠谱的参考,于是写下本文。

MSVC 工具链一般情况下使用 MSBuild 工具来生成解决方案和项目,为 MSBuild 开启并行则可以同时生成多个项目, 为 MSVC 编译器开启并行则可以同时生成多个编译单元。

为 C/C++ 编译器开启并行

为 C/C++ 编译器开启并行支持,使得 MSBuild 在编译单个目标的时候也能尽可能并行。开启方式有以下几种:

为 MSBuild 开启并行

由于直接用 MSBuild 命令行编译自己的解决方案只能生成单个目标(一般来说是 x86 Debug 目标)下的全部项目, 而 Windows 下的项目一般需要支持多个目标(一般来说是 Debug 和 Release 配置下的 x86, x64, arm64 目标), 于是需要写一个 prop 配置文件来实现一次性编译自己想要的全部目标,prop 文件参考如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<Project 
DefaultTargets="Restore;Build"
xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<SolutionPath>$(MSBuildThisFileDirectory)*.sln</SolutionPath>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Debug;Platform=x86</AdditionalProperties>
</ProjectReference>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Release;Platform=x86</AdditionalProperties>
</ProjectReference>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Debug;Platform=x64</AdditionalProperties>
</ProjectReference>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Release;Platform=x64</AdditionalProperties>
</ProjectReference>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Debug;Platform=ARM64</AdditionalProperties>
</ProjectReference>
<ProjectReference Include="$(SolutionPath)">
<AdditionalProperties>Configuration=Release;Platform=ARM64</AdditionalProperties>
</ProjectReference>
</ItemGroup>
<Target Name="Restore" >
<MSBuild
Projects="@(ProjectReference)"
Targets="Restore"
StopOnFirstFailure="True"
Properties="PreferredToolArchitecture=x64" />
</Target>
<Target Name="Build" >
<MSBuild
Projects="@(ProjectReference)"
Targets="Build"
BuildInParallel="True"
StopOnFirstFailure="True"
Properties="PreferredToolArchitecture=x64" />
</Target>
<Target Name="Rebuild" >
<MSBuild
Projects="@(ProjectReference)"
Targets="Rebuild"
BuildInParallel="True"
StopOnFirstFailure="True"
Properties="PreferredToolArchitecture=x64" />
</Target>
</Project>

然后使用 MSBuild 命令行加上 -m 参数编译你写好的 prop 配置文件就可以使 MSBuild 真正的并行起来了。

相关内容

Windows 研究笔记