代码之家  ›  专栏  ›  技术社区  ›  Mike

生成文件循环依赖项

  •  4
  • Mike  · 技术社区  · 15 年前

    这是我的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 依赖于 program.lex.o 在makefile中。我看到依赖树有4层深,但它看起来不是圆形的。

    如何改进makefile?

    4 回复  |  直到 13 年前
        1
  •  2
  •   Jack Kelly    15 年前

    @AAA鲤鱼是正确的,这是一个隐含的规则,但它不是 LEX 规则,因为它们建立 N.c N.r N.l 这是一条规则 N N.o . 在我看来,这就像“链接单个对象文件”规则,如 info (make) Catalogue of Rules . 重命名你的 .lex 文件到 .l 文件将解决此问题。

    还有:跑步 flex 我不认为你真的需要 .tab.h 用于生成lexer源的文件。试试这个:

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

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

        2
  •  6
  •   Beta    15 年前

    问题是make中有一个隐式规则(无论如何,在gnumake中),用于链接单个对象文件以构建en可执行文件。你的makefile没有提到如何构建 program.lex ,因此make返回隐式规则,从中构建它 program.lex.o .

    因为你的布局似乎取决于 程序 首先,可以通过为添加自己的规则来抑制隐式规则 程序 (什么都不做):

    program.lex:;
    
        3
  •  2
  •   Anycorn    15 年前

    运行make with-d:

    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 i 放下

    去掉“.lex.*”扩展名

        4
  •  0
  •   Jonathan Leffler    15 年前

    我的直接反应是你需要在规定之后采取行动 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所建议的隐式规则而进行的。