0

我观察到具有多个具有多个源文件的项目的 C++ Visual Studio (VS) 2017 解决方案可能不会在单个项目中并行构建。另一方面,项目总是并行构建的。特别是我还发现,当从 CMake 生成 VS 解决方案时,当解决方案中有多个项目时,一个项目内的源文件很可能不会并行构建。从几个 StackOverflow 问题和 MSDN 中,我可以看到我们可以在 VS 中设置并行构建,但它不控制 VS 是否会在一个内构建源文件项目也是并行的。有人可以向我解释如何设置它,以便 VS 在所有情况下始终在一个项目中并行构建源文件吗?或者有可能做到吗?

我的典型 VS 解决方案之一包含约 100 个项目。每个项目包含 2~30 个 .cpp/.h 文件。

编辑:

我的问题与 Visual Studio 中相互依赖的项目的并行编译不同。我想知道当解决方案中存在多个项目时,是否有办法控制单个项目中并行构建的行为。另一方面,引用的问题与解决方案中具有依赖关系的项目的并行构建问题有关。

EDIT2(回答我的问题):

经过长时间的排查,我终于弄清楚是什么原因导致解决方案无法并行构建的问题。正如我上面提到的,我的问题与启用某些与并行构建相关的开关(例如 /MP、# 要使用的线程等)无关。对于那些遇到同样问题的人,我会在这里解释一下。原因很简单。我在项目配置中使用了 Visual Studio 环境变量。我使用的变量是 %(Filename)。在执行 cl.exe 命令之前,Visual Studio 会将所有这些变量转换为它们的实际值。结果,每个源文件都将具有不同的编译选项,尽管它们都具有相同的属性表中的选项“%(文件名)”。如果同一项目中的两个源文件没有相同的编译选项,它们将不会并行构建。总之,谨慎使用环境变量,尽可能消除编译选项的差异。

4

1 回答 1

-1

好吧,这取决于您的源文件之间的所谓物理依赖关系。例如,如果文件 A 包含文件 B,则无法并行编译它们。不同项目中的源文件很可能不会相互包含,因此可以并行构建多个项目。请记住,缓慢构建是 C++ 的特征之一,为了实现快速构建,应格外小心,归结为管理源文件之间的物理依赖关系,例如使用前向声明。在 John Lakos 的《大规模 C++ 软件设计》一书中对此问题进行了深入的讨论。

于 2019-09-13T23:15:37.523 回答