当我们工程特别大时(尤其是基于AUTOSAR开发的工程,包含了BSW协议栈及MCAL,ASW的代码其c文件数量级可达上千)全编译一个工程需要很长时间。
HighTec是增量式编译,每次只重新编译修改的.c文件。当我们修改了某个c文件,在编译时make工具会根据c文件之间的依赖关系去编译影响到的c文件,从根本上说这时候编译时间不是我们能左右的。但我们还是可以通过设置Hightec配置来提高编译效率以及避免一些不必要的重复操作,这里提供四个优化思路供参考。
优化方法1:启用平行编译并将CPU核数设置为你电脑的CPU核数量
下图最右可以看到笔者的计算机核数为8,因此将"Use parallel jobs"设置为8从而充分发挥电脑的性能。选项“Stop on first build error”默认是选中状态,这样在编译时一旦出错就会停止继续编译;如果未选中,即使出现编译错误也会继续向下编译其它c文件直到编译结束。
优化方法2:避免每次都生成makefile文件
HighTec在编译时默认是根据工程源文件的组织结构首先生成makefile文件,然后执行“make makefile”指令来开始编译工程,注意是在你每次单击“编译”按钮时每次都会生成makefile文件。如果我们没有在工程中增加或删除c/h文件,每次HighTec生成的makefile是一样的,也即生成makefile步骤是重复执行的,因此我们可以将下图“Generate Makefiles automatically”选型去掉从而避免重复生成makefile。
但当去掉了“Generate Makefiles automatically”选项之后也会造成一些不便,如果你增加或删除了c/h文件或者执行了Hightec的“Clear All”指令,又不得不把这个选项重新打钩,显然又比较麻烦。因此这里提到的优化方法2请读者自行决定是否启用。
优化方法3:程序模块化,每个模块做成静态库
把程序模块化可以减少编译时间,具体做法是把整个工程按照功能分成若干个模块,每个模块建一个工程,工程设置为生成静态库文件而不是可执行elf文件,如下图。
另需再建一个集成工程,该集成工程中引用各个模块生成的库(libXXX.a),在该集成工程中编译并链接模块库最终生成可执行代码。关于如何使用库文件,
那么为什么这种做法可以减少编译时间呢?其实很容易明白模块化后假如修改了某个模块,只需要重新编译修改的模块和集成工程即可。这样相当于将修改“局部化”了,而不是之前一个修改可能会影响到整个工程。而且静态库只参与最后的Link环节,不需要编译,所以可以提高编译速度。
优化方法4:编译时关掉360等杀毒软件
实际测试发现,编译时关掉360等杀毒软件可以加快编译速度。