如何在visual studio 2008中优化建筑速度

tib*_*boo 11 c++ compiler-construction build visual-studio-2008

有人可以给我提高视觉工作室2008的建筑速度吗?
我有一个大型项目,包含许多具有完整源代码的模块.每次构建时,每个文件都会被重建,其中一些文件没有被更改.我可以阻止重建这些文件吗?我打开属性"启用最小重建"/ Gm,但编译器抛出此警告

Command line warning D9030 : '/Gm' is incompatible with multiprocessing; ignoring /MP switch
Run Code Online (Sandbox Code Playgroud)

提高建筑速度的每一个提示都会对我有所帮助.谢谢,

Dan*_*n O 16

对于超过一定大小的每个项目,C++编译时间都是一场战斗.幸运的是,有这么多人编写大型C++项目,有各种各样的解决方案:

经典的廉价解决方案是"统一构建".这只是意味着使用#include将所有.cpp文件放入单个文件进行编译.关于stackoverflow的"Unity构建"已经提出了很多问题,是我所知道的最突出的问题.此截屏视频演示了如何在Visual Studio中设置此类构建.

我的理解是,统一构建比经典构建快得多,因为它们有效地缓存了预处理器和链接器完成的工作.统一构建的一个缺点是,如果你触摸一个cpp文件,你将不得不重新编译你的"大"cpp文件.你可以通过打破你在Unity统一构建中迭代的cpp文件并自己编译它来解决这个问题.

除了Unity构建之外,这里列出了我的最佳实践:

  • #include仅在必要时使用,更喜欢前向声明
  • 使用pimpl习惯用法将类实现保留在常用的头文件中.这样做允许您将成员添加到实现,而无需长时间重新编译
  • 对于很少更改的常用头文件,请使用预编译头文件(pch)
  • 确保您的构建系统使用本地硬件上的所有可用内核
  • 保留预处理器必须搜索最小的目录列表,在#include语句中使用精确路径
  • 使用#pragma once头文件的顶部而不是#ifndef __FOO_H #define __FOO_H ... #endif,如果你使用#ifndef技巧,编译器必须在每次包含时打开头文件,#pragma once使编译器更高效

如果你正在做所有这些(统一构建将产生最大的不同,根据我的经验),最后一个选项是分布式构建.distcc是我所知道的最好的免费解决方案,incredibuild是专有的行业标准.我认为分布式计算将是从混乱的C++编译过程中获得大量迭代时间的唯一方法.如果您可以访问相当多的机器(例如,10-20),这是完全值得研究的.我应该提到统一构建和分布式构建并不是完全共生的,因为传统的编译可以分成更小的工作块而不是统一构建.如果你想分发,可能不值得建立一个统一版本.


Ujj*_*ngh 6

Enable Minimal Build:/Gm与以下内容不兼容Build with Multiple Processes:/MP{<cores>}
因此,您一次只能使用这两个中的一个.

/ Gm>项目属性:配置属性 > C/C++ > CodeGeneration

/MP {n}>项目属性:配置属性 > C/C++ > 命令行


还要防止不必要的构建(未受影响的文件) - 正确构建代码; 遵循以下规则:

在[ .h]头文件中,放置头文件本身内容所需的内容;
以及您需要在多个执行单元之间共享的所有内容.

其余的都在实现[ .c/ .cpp]文件中.


Nec*_*lis 3

一种简单的方法是在调试模式下编译(也称为零优化),这当然仅用于内部测试。

您还可以使用预编译头*来加速处理,或将“不变”段分解为静态库,从重新编译中删除它们。

*/MP在进行多进程编译之前需要创建预编译头,/MP根据MSDN可以读但不能写