6

这是我的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 $<

每当我尝试编译时,我都会收到警告,我在 makefile 中make: Circular program.lex <- program.lex.o dependency dropped.根本看不到它program.lex是如何依赖的。program.lex.o我看到依赖树大约有 4 层深,但它看起来不是圆形的。

如何改进我的makefile?

4

4 回答 4

7

问题在于 Make 中有一个隐含的规则(好吧,无论如何,在 GNUMake 中)用于链接单个目标文件以构建可执行文件。您的 makefile 没有说明如何构建program.lex,因此 Make 依赖于隐式规则来构建它program.lex.o

由于您的布局似乎取决于program.lex必须开始,您可以通过添加自己的规则来抑制隐式规则program.lex(它什么都不做):

program.lex:;
于 2010-09-09T05:58:14.997 回答
6

使用 -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.*”扩展名

于 2010-09-09T05:54:11.653 回答
2

@aaa carp 是正确的,这是一个隐含的规则,但它不是LEX规则之一,因为它们构建N.cN.r来自N.l,这是一个构建N来自的规则N.o。在我看来,这就像“链接单个对象文件”规则,在info (make) Catalogue of Rules. 将文件重命名.lex.l文件将解决此问题。

另外: running flex,我认为您真的不需要该.tab.h文件来构建词法分析器源。试试这个:

%.l.c: %.l
    flex -o$@ $<
program.l.o: program.tab.h

这会将额外的依赖项添加到program.l.o.

于 2010-09-09T05:59:46.480 回答
0

我的直接反应是,您需要在以下规则之后采取行动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 建议的隐式规则。

于 2010-09-09T05:59:03.297 回答