makefile中的无限循环

时间:2013-12-01 11:13:00

标签: c makefile

我在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

我还是不明白,为什么在这种情况下我们有一个非常大的循环。

3 个答案:

答案 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作为要运行的命令的内部表示。