Makefile make模式规则中的计算依赖关系

Makefile make模式规则中的计算依赖关系,makefile,gnu-make,Makefile,Gnu Make,使用此简化示例Makefile PHONY: all all: prog_main prog_main.c: echo 'int module(); int main(){return module();}' > $@ module.c: echo 'int module(){return 0;}' > $@ main_objects := module.o prog_%: prog_%.o $(%_objects) $(CC) -o $@ $<

使用此简化示例
Makefile

PHONY: all
all: prog_main

prog_main.c:
    echo 'int module(); int main(){return module();}' > $@

module.c:
    echo 'int module(){return 0;}' > $@

main_objects := module.o

prog_%: prog_%.o $(%_objects)
    $(CC) -o $@ $< $($*_objects)
PHONY:all
全部:主程序
主程序c:
echo'int模块();int main(){return module();}'>$@
模块c:
echo'int module(){return 0;}'>$@
主对象:=模块.o
进度%:进度%%o$(\u对象)
$(CC)-o$@$<$($*\u对象)
make
将失败,因为

  • make不支持语法
    $(\u objects)
    ,将忽略该语法
  • module.o
    不是
    prog\u main
    的依赖项
  • make认为无需编译
    模块.o
    ,以及
  • 链接失败,因为没有
    模块.o

有没有办法告诉make,每个
prog%
都取决于
prog%
和变量
%\u对象中列出的目标

你不能做你所描述的make在处理过程中的不同时间扩展
%
和变量。但是您可以将行:
main\u objects:=module.o
替换为
prog\u main:modules.o
。如果这样做,则
module.o
将出现在
prog%:
配方中的
$^
中。所以你会有这样的想法:

.PHONY: all
all: prog_main

prog_main.c:
    echo 'int module(); int main(){return module();}' > $@

module.c:
    echo 'int module(){return 0;}' > $@

# main_objects := module.o
prog_main: module.o


prog_%: prog_%.o
    $(CC) -o $@ $^

您不能在处理过程中的不同时间执行所描述的make扩展
%
和变量。但是您可以将行:
main\u objects:=module.o
替换为
prog\u main:modules.o
。如果这样做,则
module.o
将出现在
prog%:
配方中的
$^
中。所以你会有这样的想法:

.PHONY: all
all: prog_main

prog_main.c:
    echo 'int module(); int main(){return module();}' > $@

module.c:
    echo 'int module(){return 0;}' > $@

# main_objects := module.o
prog_main: module.o


prog_%: prog_%.o
    $(CC) -o $@ $^