有没有办法优化g ++以便更快地构建?

时间:2014-02-27 16:18:05

标签: c++ g++

注意:这与生成的二进制代码的优化完全无关。

我有一个包含120多个源代码文件的项目。如果我将所有内容放入一个巨大的cpp文件中,代码的编译比运行标准的makefile构建要短得多,后者为每个cpp文件生成单独的g ++进程。 (我也注意到在cpp文件上运行g ++几乎是空的,或者根本就是空的,也需要一些时间,所以在相对较小的2个cpp文件上运行g ++比在包含代码的1个cpp文件上运行g ++要长得多两个)。

考虑到项目的大小,即使在非常快的硬件上,编译也需要很长时间。有没有什么可以做的,以加快编译器生成二进制文件所需的时间?鉴于为每个具有相同选项的cpp文件加载了g ++进程,我认为它为每个文件做了很多相同的工作(它肯定需要从某些库中加载某些东西,反复检查相同的东西等等) 。是不是有些东西可以让它跳过为每个文件重复执行“相同的任务”,以便更快地生成目标文件?

编辑:该项目是Qt应用程序,Makefile是使用qmake

生成的

4 个答案:

答案 0 :(得分:2)

您是否尝试过并行编译?您可以添加-jN标志,其中N是编译线程数(通常是1.5 * cpu核心数)。

答案 1 :(得分:2)

您可以尝试一些事项:

  • 确保您没有在每个源文件中包含每个标头,尽量减少文件之间的耦合。
  • 利用预编译的标题,避免反复阅读系统标题。
  • .C文件中包含相关的.cxx个文件集,然后使用您的makefile进行编译。这样做的结果是将所有源代码放在一个文件中,而不会使代码更难阅读。

答案 2 :(得分:1)

我知道gcc的{​​{1}}缓存最接近的是ccache,您可以在调用gcc本身时使用它

ccache gcc [...]

但我建议您切换到makecmake等建筑系统,因为这些软件能够跟踪不需要再次重新编译的依赖项和文件。 / p>

答案 3 :(得分:1)

有几件事要做:

  • 如果可能,请在标头中转发声明,而不是包含标题
  • 删除不需要的内容
  • 而不是使用qmake和makefile,请使用cmake和ninja(请参阅this
  • 获得更好的硬件(ssd磁盘,更多更快的内存,CPU,......)
  • 在构建
  • 时产生更多作业

  

如果我将所有内容放入一个巨大的cpp文件中,代码的编译比运行标准的makefile构建要短得多,后者为每个cpp文件生成单独的g ++进程。

最有可能的罪魁祸首是坏硬盘。通过获得超快速的ssd磁盘,您将看到巨大的改进。