Makefile分组目标重复定义为何触发‘覆盖配方’警告?
问题原因解析
这是因为GNU Make对分组目标的语法解析存在特殊处理,当你使用&:写在目标列表末尾的语法时,Make会错误地将&识别为一个独立的目标名称,而非分组目标的语法标记。
当你定义第一个分组目标规则时:
foo bar biz &: baz boz echo $^ > foo echo $^ > bar echo $^ > biz
Make实际上会把&当作一个额外的目标,为它绑定了对应的执行脚本。而当你添加第二个分组目标规则时:
foo2 bar2 biz2 &: baz boz echo $^ > foo2 echo $^ > bar2 echo $^ > biz2
相当于再次给&这个目标定义了新的执行脚本,这就触发了Make的“覆盖已有目标脚本”警告——因为同一个目标(这里是&)不能被定义多套执行逻辑。
要解决这个问题,需要使用GNU Make推荐的现代分组目标语法:把&放在目标列表的最前面,明确标记这是一个分组规则,而非目标名称。修正后的写法示例:
&: foo bar biz foo bar biz: baz boz echo $^ > $@ &: foo2 bar2 biz2 foo2 bar2 biz2: baz boz echo $^ > $@
这种写法下,多个分组规则之间不会再出现目标冲突的警告。
内容的提问来源于stack exchange,提问作者Timmmm
相关产品推荐
相关产品推荐

