我在makefile中读到了关于递归变量的内容。因为我们在下面的代码中加上'=',它是一个递归变量,与':='相对应
CC = gcc -Wall
# we want to add something to the end of the variable
CC = $(CC) -g
hello.o: hello.c hello_api .h
$(CC) -c hello.c -o hello.o
我还是不明白,为什么在这种情况下我们有一个非常大的循环。
答案 0 :(得分:6)
来自manual:
变量的第一个风格是递归扩展变量。 [...]您指定的值是逐字安装的;如果它包含对其他变量的引用,则只要替换此变量(在扩展其他字符串的过程中),就会扩展这些引用。发生这种情况时,它被称为递归扩展。
您的CC
变量具有这种风格。它的内容按字面意思$(CC) -g
;它不 gcc -Wall -g
。因此,当您展开此变量时,首先展开$(CC)
,它再次包含对其自身的引用,因此您可以进行无限递归。
使用:=
时的区别在于立即评估右侧,并将结果分配给变量。
答案 1 :(得分:0)
使用 CC + = -g 在第5行
此处提供更多信息http://www.gnu.org/software/make/manual/make.html#Flavors
答案 2 :(得分:-1)
你的Makefile
错了;应该是(假设 GNU make )
RM= rm -vf
CC= gcc
CFLAGS= -Wall -g
.PHONY: all clean
all: hello
hello: hello.o
hello.o: hello.c hello_api.h
clean:
$(RM) *.o *~
最后一行,就在clean:
之后,以制表符开头
有关详情,另请参阅this answer。运行make -p
以了解在上述情况下有用的隐式规则。
仔细阅读make variables上的文档。那些用=
定义的那些被懒惰地和文本地扩展(make变量在替换文本中进一步扩展)。换句话说,CC= $(CC) -g
给出了无限循环。因为第一个$(CC)
已被$(CC) -g
替换,而$(CC)
已被重新扫描,其$(CC) -g -g
将被替换为make
)等无限广告。
{{1}}主要是一个字符串处理实用程序(当然还有基于文件修改时间的依赖项)。它没有真正的AST作为要运行的命令的内部表示。