一、什么是 make -j
make -j是 Linux 开发中最常用的并行编译参数,-j全称--jobs,作用是让 make 同时启动多个编译进程,充分利用多核 CPU 加速编译。
默认不加-j时,make 是单线程串行编译,同一时刻只编译一个文件,多核 CPU 基本在摸鱼,编译速度很慢。
二、三种主流使用方式
1. 指定固定并发数(最常用)
命令格式:make -jN
例如大家常见的:make -j15
含义:限制最大同时执行15 个编译任务。
经验规则:
16核 CPU:用
-j15,留1核给系统,避免卡死8核 CPU:用
-j7 / -j8虚拟机 / 交叉编译:适当降低数值,防止内存溢出
2. 自动适配本机核心数(通用推荐)
make -j$(nproc)
nproc会自动读取当前设备 CPU 核心数,跨电脑、虚拟机、服务器都通用,是工业界标准写法。
3. 无限制并发(不推荐本地使用)
make -j
不限制进程数量,项目文件多时会瞬间产生大量 GCC 进程,极易爆满内存、系统卡死,仅高性能服务器可用。
三、为什么你的工程可以用 make -j?(核心原理)
make -j 不是所有工程都能加速,必须满足编译分离结构。
支持并行的标准结构(你的 LVGL Makefile 就是标准写法):
将编译、链接完全分开:
所有 .c 文件独立编译成 .o 文件(可并行)
最后统一链接成可执行文件(不可并行)
标准模板规则:
$(BUILD_OBJ_DIR)/%.o: %.c $(CC) $(CFLAGS) -c $< -o $@
每一个 c 文件都是独立任务,互不依赖,所以-j可以全速并行编译。
四、为什么有些工程用不了 -j?
老旧、不规范 Makefile 会把编译和链接写死在一条命令中:
demo: main.c a.c b.c gcc main.c a.c b.c -o demo
这种写法所有文件只能串行编译,make -j 完全失效。
五、常见问题与标准答案
1. 并行编译偶尔报错,串行编译正常
原因:Makefile 依赖不完善,并发编译顺序乱了。
解决:用make -j1串行复现问题,排查依赖缺失。
2. 编译中途闪退、卡死、内存不足
原因:并发数太大,GCC 进程过多吃满内存。
解决:降低-j数值。
3. 前面编译飞快,最后链接很慢
正常现象!链接阶段是单进程,无法并行加速。
六、开发常用标准命令
常规编译:
make clean && make -j15
通用跨设备编译:
make clean && make -j$(nproc)
交叉编译并行:
make CC=arm-linux-gcc -j12
排错调试:
make clean && make -j1
七、总结
make -j的本质是多进程并行编译,充分利用多核 CPU只有文件独立编译、分离编译链接的工程才能加速
日常优先使用
-j$(nproc)或核心数-1的固定值报错就切
-j1,内存不足就减小并发数