6

ここに私のメイクファイルがあります:

.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.まったく表示されないという警告が表示されます。依存関係ツリーが約 4 層の深さであることがわかりますが、循環しているようには見えません。program.lexprogram.lex.o

メイクファイルを改善するにはどうすればよいですか?

4

4 に答える 4

7

問題は、単一のオブジェクト ファイルをリンクして実行可能ファイルをビルドするための暗黙の規則が Make に (まあ、とにかく GNUMake に) あることです。あなたのメイクファイルは をビルドする方法について何も述べていない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 は正しい暗黙のルールですが、ルールの 1つではありLEXません。これは、 で説明されている「単一のオブジェクト ファイルをリンクする」ルールのように思えます。ファイルの名前をfiles に変更すると、この問題が解決します。N.cN.rN.lNN.oinfo (make) Catalogue of Rules.lex.l

また、 を実行していますが、レクサーソースをビルドするため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 に答える