我们有使用gcc和make文件的项目.项目还包含一个大的子项目(SDK)和许多使用该SDK和一些共享框架的相对较小的子项目.
我们使用预编译的头文件,但这有助于重新编译更快.
是否有任何已知的技术和工具可以帮助构建时优化?或者您可能知道有关此主题或相关主题的文章/资源?
您可以从两个方面解决问题:重构代码以降低编译器看到的复杂性,或加快编译器的执行速度.
在不触及代码的情况下,您可以为其添加更多编译功能.使用ccache避免重新编译已编译的文件和distcc以在更多计算机之间分配构建时间.使用make -j,其中N是核心数量+ 1如果在本地编译,或者更大数量用于分布式构建.该标志将并行运行多个编译器.
重构代码.更喜欢前向声明包括(简单).尽可能地去耦以避免依赖(使用PIMPL习语).
模板实例化很昂贵,它们在每个使用它们的编译单元中重新编译.如果您可以重构模板以转发声明它们,然后仅在一个编译单元中实例化它们.
我能想到的最好make
的-j
选择就是选择.这告诉我们make
要并行运行尽可能多的作业:
make -j
如果要将并发作业数限制为n,可以使用:
make -j
ñ
确保依赖项是正确的,因此make
不会运行它不需要的作业.
另一件需要考虑的事情是gcc
与-O
交换机一起进行的优化.您可以指定各种级别的优化.优化越高,编译和链接时间越长.我使用的项目运行需要2分钟才能完成-O3
,并且需要半分钟-O1
.你应该确保你没有超出你需要的优化.您可以在不进行优化的情况下构建开发构建并优化部署构建.
使用调试信息(gcc -g
)进行编译可能会增加可执行文件的大小,并可能影响您的构建时间.如果您不需要它,请尝试将其删除,看它是否会影响您.
链接类型(静态与动态)应该有所不同.据我所知,静态链接需要更长时间(虽然我可能在这里错了).您应该看看这是否会影响您的构建.