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

如何在GNU Makefile目标前置条件中使用花括号扩展?

原因说明
  • Bash的大括号扩展是shell的特性,GNU Make本身不原生支持该语法
  • Makefile中的目标、依赖列表由Make自身直接解析,只有目标下方缩进的执行命令(recipe)才会调用指定的SHELL执行,因此仅设置SHELL:=/bin/bash不会对依赖列表的大括号生效。
解决方案

方案1:主动调用shell扩展(写法最贴近原有习惯)

通过Make的shell函数手动调用bash完成大括号扩展,示例代码如下:

SHELL:=/bin/bash
# 调用shell完成大括号展开,生成目标文件列表
OBJS := $(shell echo src/{foo/{one,two},bar/{three,four}}.o)

all: $(OBJS)
	@echo "$(^)"

# 补充.o文件的生成规则,根据你的实际源文件后缀调整即可
src/%.o: src/%.c
	$(CC) -c $< -o $@

方案2:使用Make原生函数实现(兼容性最优)

如果不想依赖shell,可使用Make内置的字符串处理函数生成文件列表,跨平台性更好,性能也更高:

# 分别生成不同目录下的.o文件列表
FOO_OBJS := $(addprefix src/foo/, one.o two.o)
BAR_OBJS := $(addprefix src/bar/, three.o four.o)
OBJS := $(FOO_OBJS) $(BAR_OBJS)

all: $(OBJS)
	@echo "$(^)"

# 同样补充.o文件的生成规则
src/%.o: src/%.c
	$(CC) -c $< -o $@
补充说明

如果只是做功能测试不需要真实编译生成.o文件,可以添加对应的空规则或者将目标声明为.PHONY即可避免报"无规则生成目标"的错误。

内容的提问来源于stack exchange,提问作者onlycparra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 19:18:00