尝试像下面这样的 Makefile 规则不起作用(GNU Make 4.0):
foo: [email protected] other.o
bar: bar.o other.o
该文件foo.c
已编译(为foo.o
),但链接命令为cc -o .o
.
相反,bar
已正确编译并链接为cc bar.o other.o -o bar
.
谁能解释一下差异(或问题)?
答案1
这在以下部分中得到解决:自动变量在 GNU Make 手册中:
认识到自动变量值可用的有限范围非常重要:它们仅在配方中具有值。特别是,您不能在规则的目标列表中的任何位置使用它们;它们在那里没有任何价值,并将扩展为空字符串。此外,无法在规则的先决条件列表中直接访问它们。一个常见的错误是尝试
$@
在先决条件列表中使用;这是行不通的。
本段的其余部分给出了一种可能的解决方案,尽管是特定于 GNU Make 的解决方案:二次扩张。将你的 Makefile 写为
.SECONDEXPANSION:
foo: [email protected] other.o
bar: bar.o other.o
允许$$@
给定适当的值,然后
$ make foo
cc -c -o foo.o foo.c
cc -c -o other.o other.c
cc foo.o other.o -o foo
做你希望它做的事情。
(根据我的经验,通常有比诉诸二次扩展更好的方法来解决问题,但这只能通过了解您正在尝试做的事情的总体目标来确定。)