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

如何编写含多目标依赖且执行相同规则的GNU Makefile?求替代方案

嘿,你已经用define函数搞定了多目标共享规则的问题,不错嘛!其实GNU Make还有几种更灵活的替代方案,我给你梳理一下:

方案1:多目标规则(最简洁的无规律配对)

如果你的目标和依赖是无规律的一对一配对,直接先单独定义每个目标的依赖,再把所有目标放在同一个规则块里共享命令就行:

# 先逐个定义目标-依赖关系
a: b
c: d
e: f

# 给所有目标统一指定执行命令
a c e:
    cp $< $@

Make会自动为每个目标匹配对应的依赖,执行命令时$<会替换成当前目标的依赖,$@替换成当前目标,完全满足你的需求。

方案2:静态模式规则(适合有命名规律的场景)

如果你的目标和依赖有固定的命名模式(比如目标是a依赖a_src,c依赖c_src),静态模式规则会更高效:

# 假设目标是a、c、e,对应依赖是a_src、c_src、e_src
TARGETS := a c e

$(TARGETS): %: %_src
    cp $< $@

这种方式不用逐个写依赖,只要符合%匹配的模式,Make会自动关联目标和依赖。

方案3:foreach循环+eval(适合大量目标-依赖对)

如果你有几十上百组目标-依赖对,手动写太麻烦,可以用foreach遍历配对列表,再用eval生成规则:

# 定义所有目标-依赖对,用空格分隔每一组(格式:目标:依赖)
PAIRS := a:b c:d e:f

# 遍历每一组,自动生成目标-依赖规则
$(foreach pair,$(PAIRS), \
    $(eval $(firstword $(subst :, ,$(pair))):$(lastword $(subst :, ,$(pair)))) \
)

# 统一指定执行命令
a c e:
    cp $< $@

这样新增配对时,只要在PAIRS里加一行就行,不用改其他地方,维护起来很方便。

方案4:模式规则(通用匹配场景)

如果你的目标和依赖的后缀有规律(比如目标是.txt文件,依赖是.md文件),模式规则是最通用的选择:

%.txt: %.md
    cp $< $@

所有.txt目标都会自动匹配对应的.md依赖,执行复制命令。

这些方法各有优劣,你可以根据自己的目标数量、命名规律来选最顺手的~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:46:40