【发布时间】:2010-11-26 04:38:29
【问题描述】:
我们有一个大型 Visual Studio 2005 C++/Mfc 解决方案,1 个项目包含大约 1300 个源文件(大约 650 个 .h 和 650 个 .cpp 文件)。我们还使用 Boost 和其他一些库(COM:MSXML、Office)。
最近,我添加了一些 boost::multi_index 实例来加快速度。这一切大部分时间都在编译。但是现在,当我进行完整(发布)重建时,我会在几个模块处遇到编译器崩溃。
Fatal Error C1060: "compiler is out of heap space"
我已经尝试减少预编译头文件中的包含(删除了除了标准 MFC 头文件之外的几乎所有内容)。另外,我删除了编译器选项 /Zm200(我们之前需要它来编译预编译的头文件)。
奇怪的是:当我在编译器崩溃后按 F7(构建)时,构建过程继续没有任何问题(或者至少直到下一次编译器崩溃,我再次按 F7)。但是,如果能够在没有任何中断的情况下进行完整的构建,那就太好了。
我可以影响各个模块的构建顺序吗?这样,我可以将“有问题”的模块放在流程的开头(并希望崩溃不会转移到其他模块)。
顺便说一句:完整的构建大约需要 90 分钟。
更新:
感谢您的回答。我能够摆脱编译器崩溃并显着减少编译时间。这是我所做的:
- 我从预编译的头文件中删除了所有包含,只保留了标准的 windows/mfc 头文件。这迫使我在其他模块中添加更多包含,但最终所有内容都包含在需要的地方。当然,这一步增加了编译时间,但让我在下一步中更有效率。
- 我安装了ProFactors IncludeManager的试用版。项目详细视图可以导出到 Excel,其中可以很快发现要包含在预编译头文件中的瓶颈和候选对象。
- 大部分编译时间都浪费在一些头文件上,这些头文件包括一堆其他头文件(包括更多...)。我不得不使用前向声明来摆脱一些讨厌的依赖。此外,我将一些类/函数从关键头文件中移到了它们自己的模块中。
- What to put in precompiled header? (MSVC) 帮助我正确获取了预编译头文件中的包含。我添加了 STL、Boost、Windows 标头。然后添加我们自己的(或多或少稳定、优化的)头文件,以及资源头文件。
- 我重复了步骤 3 和 4 几次,始终使用 IncludeManager 检查新候选人。
- 步骤 1 到 5 将编译时间(发布模式)从 90 分钟缩短到大约 45 分钟。
- 我禁用了所有内容的浏览信息生成,因为我们似乎没有使用它(而且我找不到任何关于它真正有用的信息......)。这又切断了 6 分钟的构建过程。
- 我在 C++ 编译器命令中添加了 /MP(多处理器支持)开关。现在重建时间减少到 22 分钟。这一切都是在单核 PC 上完成的。
- 我将整个解决方案移至双核 PC。在那里重建项目需要 16 分钟。
- 创建调试版本快 5 分钟:
- 单核机17分钟,
- 11 分钟在双核机器上。
更新 2:
上面我提到“单核机”,实际上是指速度较慢的双核机。
【问题讨论】:
-
Above, where I mention "single core machine", actually a slower dual core machine is meant.lol
标签: c++ visual-studio-2005 compiler-construction crash