网站开发团队需配备什么岗位,大连做网站公司排行榜,重庆网站推广转化率,论坛网站如何建设引言
最近在编译项目代码的时候#xff0c;发现全量编译一次代码需要十分钟#xff0c;加了多核编译参数之后#xff0c;还会出现各种错误#xff0c;导致编译失败。于是我就想改造下makefile文件#xff0c;使其能够多核编译#xff0c;经过改造之后#xff0c;效果显…引言
最近在编译项目代码的时候发现全量编译一次代码需要十分钟加了多核编译参数之后还会出现各种错误导致编译失败。于是我就想改造下makefile文件使其能够多核编译经过改造之后效果显著8核编译的情况下只要1分半编译速度提高了7倍为之惊奇。
多核编译失败的原因
要实现多核编译最重要的一点就是确定正确的依赖关系。如下Makefile文件
all: d c b a
a: # 执行一些规则
b: c# 执行一些规则
c: d# 执行一些规则
d:# 执行一些规则如果直接执行make all完全没有问题他会依照d、c、b、a的顺序去执行各个规则。那我如果使用make all -j4会怎么样那么就有可能是a、d先并行执行然后再c、d顺序去执行。因为依赖关系是c依赖d那么必须等d执行完而b又依赖c就得等c执行完。那么问题来了如果a实际上要依赖b呢必须等b执行完产出a执行时所依赖的文件。那么很明显此时多核编译就会失败。
如何提高多核编译的效率
不要在一个目标下写多个规则或者命令因为那样会导致他们只能是串行执行如下
amake all -C dir1make all -C dir2make all -C dir3上述写法就只能串行执行各个命令。改成如下方式
DIRS dir1 dir2 dir3
.PHONY: $(DIRS)
all: aa: $(DIRS)$(DIRS): %: make all -C $此时如果执行make all -j4就可以并发执行三条命令了。 再比如编译生成某个库文件或者可执行文件时千万不要写成如下方式
app: *.cppg -o $ $^ -I./ 这种情况下显然效率极低即不利于多核编译也不利于增量编译。正确写法应该如下
source$(wildcard ./*.cpp)
obj$(patsubst %.cpp, %.o, $(source))OBJS: $(obj)
$(obj) : %.o : %.cppg -c $ -o $ -I./app: $(obj)g $^ -o $多核编译的情况下会并行编译多个cpp文件从而提高编译效率并且增量编译也只会编译有修改的cpp文件。