最近在整windows 下的gcc 工具链编译,发现bat 调用make -j4 会有如下警告
warning: jobserver unavailable: using -j1. Add `+' to parent make rule,以为是windows 下make 不支持多核编译的原因,但是今天我把同一份代码放到ubuntu下 编译,一样的警告,并且ubuntu 编译别的Linux code 是没有问题的,搜索网络文章,众说纷纭。
不过有人说是Makefile 写的不合理,依赖比较散乱,导致make 没法多进程编译?我觉得这个有道理啊。
比如说上层模块是a,有三个子模块b, c, d
报错是在生成a的目标文件时缺少b的目标文件,而在报错后编译才进入b的目录编译b模块。
貌似是有个make子进程专门负责生成a目标文件,其他进程编译子模块b,c,d。本来应该是
b, c, d都编译完了,再生成a。现在成了b,c, d还没编译,就执行了生成a的规则。
那些说把make 替换为$(MAKE)可以解决的确认是不可行的,这个问题更深层次的原因,后面我一定要找到。
经过分析代码,觉得有如下可能:
在父目录的Makefile中export出变量,比如export CFLAGS
在父目录的Makefile中make -C child_dir 就能去寻找子目录中的Makefile并进行编译
make -j4的时候向子Makefile编译的时候出现问题
make[1]: warning: jobserver unavailable: using -j1. Add `+’ to parent make rule.
因为子的Makefile中没有make命令,只有${CC}命令,此时make不能实现多线程编译。
解决的办法是在编译这个子Makefile的时候使用+make -C child_dir
的确,子目录没再出现过make 了,如果不存在子目录的话那就真的不会出现这种情况。