有段时间不做编译的事情了,记得上次做还是13年初编译Gentoo内核的时候,现在装点东西都是使用源直接安装了(Centos)。最近使用Debian系统了,虽然说也有apt的方式,但还有时候需要编译点东西。最开始的时候还真忘了-j这个参数,编译个东西这个慢啊。因为CPU是一个影响编译速度的重要因素了,所以make -j带上一个参数,可以把项目在进行中并行编译,现在服务器上的CPU差不多都是多核多线程的,所以完全可以用make -j4,让make最多允许4个编译进程同时执行,这样可以更有效的利用CPU资源。
官方建议是少用这个参数,因为如果多个进程在同一时间运行在同一个函数库打包文件上,就很有可以损坏这个函数库文件。所以,在make未来的版本中,应该提供一种机制来避免并行操作发生在函数打包文件上。
-j后面的数据不是越大越好,因为如果太大,CPU的切换频率就会越频繁,反正影响它的使用。
另外一种是相对来说解决IO的问题,也就是说把文件放到内存上做处理,这可比在磁盘上快多了,尤其是在编译器需要生成很多临时文件的时候。在Linux中,直接使用/run/shm就可以,当然也可以mount到另外的目录下,其它不变即可。加上-o size=10G可以确定它的大小 。如 mount -t tmpfs tmpfs /mnt-o size=10G
另外在网上看到有人使用ccache,它主要是用于把编译的结果进行缓存,以便在再次编译的时候可以节省时间。这个我没用过,只是简单的说下。
安装完ccache后,可以在/usr/local/bin下建立gcc,g++,c++,cc的symbolic link,链到/usr/bin/ccache上。总之确认系统在调用gcc等命令时会调用到ccache就可以了(通常情况下/usr/local/bin会在PATH中排在/usr/bin前面)。可以使用ccache -s来查看cache的使用和命中情况。
还有一个是distcc,它是一个小型应用程序,与 gcc 编译器是配合使用的,并且它允许在另一台安装了 distcc 的机器上进行编译工作。因为一台机器的能力有限,可以联合多台电脑一起来编译。在公司的网络环境中是足可以满足它的需要。
使用distcc,并不要求每台电脑都具有完全一致的环境,它只要求源代码可以用make -j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。使用方法不多说了,自己找吧。
用这几个编译程序或者做一套预处理的方案还是一个不错的选择。
阅读(966) | 评论(0) | 转发(0) |