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

GNU make中如何使用变量值作为函数名完成call调用?

Makefile 动态遍历列表调用函数解决方案

问题根因

Make 内置的$(call)属于Make预展开阶段执行的操作,会在整个目标的recipe被完整传递给Shell执行前就完成计算。而你代码里的$$comp是Shell层面的变量,要等到Shell实际运行循环的时候才会被赋值,此时Make早就结束了call的解析流程,根本拿不到$$comp对应的实际值,自然无法正确调用对应函数。

你遇到的语法报错也是同理:$(call $$comp)展开后是无效的残缺内容,传给Shell后缺少合法的语句结束标记,才会抛出unexpected end of file错误;写死函数名时$(call FUNCTION)能正常展开为完整的命令行,补充分号和续行符后Shell就能正常解析。

解决方法:用Make层面的遍历替代Shell循环

最稳妥的实现方式是把遍历逻辑放在Make层处理,直接用foreach函数遍历处理后的列表,逐个调用目标函数,完全避开展开时机冲突,示例代码如下:

# 预先定义你要调用的各业务函数(样例)
define func1
	@echo "执行函数 func1"
	echo "func1 生成的内容" >> target.txt
endef

define func2
	@echo "执行函数 func2"
	echo "func2 生成的内容" >> target.txt
endef

# 替换为你自己的LIST变量即可
LIST := src/func1.c src/func2.c

.PHONY: GEN_BAT
GEN_BAT:
	$(foreach comp,$(basename $(notdir $(LIST))),$(call $(comp));)

这种写法不需要处理Shell循环的续行符,所有函数调用都由Make直接解析,不会出现语法适配问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 12:48:01