在 Makefile 依赖项中使用“[email protected]”将不起作用

在 Makefile 依赖项中使用“[email protected]”将不起作用

尝试像下面这样的 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

做你希望它做的事情。

(根据我的经验,通常有比诉诸二次扩展更好的方法来解决问题,但这只能通过了解您正在尝试做的事情的总体目标来确定。)

相关内容