[英]Makefile circular dependency
这是我的Makefile:
.PHONY: all homework1
CFLAGS= -g -O0 -Wall -Werror -Wno-unused-function
LDFLAGS= -lm
all : homework1
homework1 : program.tab.o program.lex.o
%.o : %.c
gcc -o$@ -c $(CFLAGS) $<
%.lex.c : %.lex %.tab.h
flex -o$@ $<
%.tab.c %.tab.h : %.y
bison --verbose -o$@ -d $<
每当我尝试编译时,我都会收到警告make: Circular program.lex <- program.lex.o dependency dropped.
我看不出program.lex
在makefile中是如何依赖program.lex.o
的。 我看到依赖树是如何约4层深,但它看起来不是圆形的。
如何改进我的makefile?
麻烦的是Make中有一个隐含的规则(好吧,无论如何,在GNUMake中),用于链接单个目标文件以构建可执行文件。 你的makefile没有说明如何构建program.lex
,所以Make依赖于隐式规则来从program.lex.o
构建它。
由于你的布局似乎依赖于开始使用program.lex
,你可以通过为program.lex
添加自己的规则来禁止隐式规则(它什么都不做):
program.lex:;
用-d运行make:
Considering target file `all'.
File `all' does not exist.
Considering target file `homework1'.
File `homework1' does not exist.
Considering target file `program.lex.o'.
File `program.lex.o' does not exist.
Looking for an implicit rule for `program.lex.o'.
Trying pattern rule with stem `program.lex'.
Trying implicit prerequisite `program.lex.c'.
Found an implicit rule for `program.lex.o'.
Considering target file `program.lex.c'.
Looking for an implicit rule for `program.lex.c'.
Trying pattern rule with stem `program'.
Trying implicit prerequisite `program.lex'.
Found an implicit rule for `program.lex.c'.
Considering target file `program.lex'.
Looking for an implicit rule for `program.lex'.
Trying pattern rule with stem `program.lex'.
Trying implicit prerequisite `program.lex.o'.
Found an implicit rule for `program.lex'.
make: Circular program.lex <- program.lex.o dependency dropped.
有隐含的链接规则被调用,而不是我最初放下的lex
摆脱“.lex。*”扩展
@aaa carp是正确的,这是一个隐含的规则,但它不是LEX
规则之一,因为它们从Nl
构建Nc
或Nr
,这是一个从No
构建N
的规则。 在我看来,像“链接单个目标文件”规则,在info (make) Catalogue of Rules
描述。 将.lex
文件重命名为.l
文件将解决此问题。
另外:运行flex
,我认为你真的不需要.tab.h
文件来构建lexer源代码。 试试这个:
%.l.c: %.l
flex -o$@ $<
program.l.o: program.tab.h
这将为program.lo
添加额外的依赖项。
我的直接反应是你需要在homework1: program.tab.o program.lex.o
规则之后执行一个操作homework1: program.tab.o program.lex.o
:
homework1: program.tab.o program.lex.o
${CC} -o $@ program.tab.o program.lex.o ${LDFLAGS}
但是,由于你还将homework1
标记为.PHONY
,也许你尚未准备好连接程序。 但是你的问题再现了......
通常,Lex(或Flex)的源代码保存在.l
文件中,而不是.lex
文件中,因此我将makefile更改为:
.PHONY: all homework1
CFLAGS= -g -O0 -Wall -Werror -Wno-unused-function
LDFLAGS= -lm
all : homework1
homework1 : program.tab.o program.lex.o
%.o : %.c
gcc -o $@ -c $(CFLAGS) $<
%.lex.c : %.l %.tab.h
flex -o $@ $<
%.tab.c %.tab.h : %.y
bison --verbose -o $@ -d $<
警告信息消失了。 (我最初使用' touch program.lex program.y
'来创建你的环境;然后我将program.lex
移动到program.l
)。
但是,我仍然不太确定破碎版本中发生了什么 - 但它可能确实围绕@Beta建议的隐式规则。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.