如何消除Makefile中run规则的依赖与命令重复定义问题?
原有错误写法问题分析
你尝试的$(foreach p,$^,$(shell $(p)))写法无法正常工作,核心有两个原因:
$(shell)是Make的预处理函数,执行时机在Make解析阶段,早于所有目标的编译构建流程,此时bin/p1这类依赖文件还没有生成,自然执行失败foreach是Make层面的遍历函数,不是交给Shell执行的逻辑,完全不符合「先编译所有依赖、再依次运行可执行文件」的执行顺序要求
正确实现方法
最简修改方案
仅修改run规则的执行部分,用Shell循环遍历所有依赖即可,注意Shell变量$p要写成$$p转义,避免被Make提前解析为空值:
.PHONY: run run: bin/p1 bin/p2 bin/p3 for p in $^; do $$p; done bin/%: %.cpp mkdir -p bin clang++ -o $@ $<
其中$^是Make内置的自动变量,会自动展开为当前规则的所有前置依赖,也就是你声明的所有bin/开头的可执行文件。
更适合后续扩展的方案
如果run的依赖会持续增加,可以把目标名统一维护在变量中,后续新增目标仅需要修改变量一处即可:
# 新增可执行目标只需往该列表追加名称即可,无需修改其他逻辑 TARGETS := p1 p2 p3 .PHONY: run run: $(addprefix bin/,$(TARGETS)) for p in $^; do $$p; done bin/%: %.cpp mkdir -p bin clang++ -o $@ $<
内容的提问来源于stack exchange,提问作者425nesp
相关产品推荐
相关产品推荐

