You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Makefile延迟编译问题:如何合并多目标CFLAGS后再编译?

解决Makefile多配置编译标志合并问题

问题原因

执行make debug perf时,Make会逐个处理debug和perf目标:

  1. 处理debug时,给该目标上下文的CFLAGS追加-g,编译生成executable;
  2. 处理perf时,虽给该目标上下文的CFLAGS追加-D__PERF__,但此时executable已是最新状态,Make会跳过编译步骤。
    且两个目标的CFLAGS是独立作用的,不会自动合并。

解决方案

通过Make内置变量MAKECMDGOALS获取命令行指定的所有目标,提前合并所有需要的编译标志,再执行一次编译。修改后的Makefile如下:

CFLAGS = -std=c11 -Wall -pedantic -D_GNU_SOURCE

# 根据命令行传入的目标追加对应编译标志
ifneq (,$(filter debug,$(MAKECMDGOALS)))
CFLAGS += -g
endif
ifneq (,$(filter perf,$(MAKECMDGOALS)))
CFLAGS += -D__PERF__
endif

# 声明伪目标,避免与同名文件冲突
.PHONY: debug perf executable

# debug和perf仅作为编译触发入口
debug: executable
perf: executable

# 统一编译目标
executable:
	gcc $(CFLAGS) main.c -o exe

说明

  • MAKECMDGOALS存储命令行指定的所有目标,通过filter函数判断是否包含debug或perf,从而追加对应编译标志;
  • .PHONY声明确保这些目标不会被目录下的同名文件干扰;
  • 无论执行make debug、make perf还是make debug perf,都会先合并所有需要的编译标志,仅执行一次编译,不会重复编译或遗漏标志。

内容的提问来源于stack exchange,提问作者Rui Gonçalves

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:15:50