1

そのため、以下に説明するアプリケーションを生成するメイクファイルを作成し、生成された各ファイルに独自のルールがあることを確認する必要があります。

makefile の場合: 最初のツールは flex です。このツールは、 というファイルを受け取り、 というファイルspec.lを生成しますlex.yy.c。bison と呼ばれる別のツールは、ファイルを想定してファイルcalledspec.yを生成しますspec.tab.c。ディレクティブを使用して bison を呼び出すと、(lex.yy.c をコンパイルするときに必要な)-vdというファイルも生成されます。spec.tab.h2 つの C ファイルをオブジェクト ファイルにコンパイルし、yacc (-ly) および lex (-ll) ライブラリと一緒にリンクしてコンパイラ ( a.out. .l と spec.y:

flex spec.l
bison -vd spec.y
gcc -c lex.yy.c
gcc -c spec.tab.c
gcc spec.tab.o lex.yy.o -ly -ll

この問題をどこから始めればよいかわかりません

編集:私がこれまでに持っているもの

compiler: spec.tab.o lex.yy.o
gcc spec.tab.o lex.yy.o -ly –ll
lex.yy.c: spec.l
flex spec.l
spec.tab.c: spec.y
bison -vd spec.y
spec.tab.o: spec.tab.c
gcc -c spec.tab.c
lex.yy.o: lex.yy.c spec.tab.h
gcc –c lex.yy.c
clean:
rm –f *.c *.o a.out
4

1 に答える 1

2

依存関係についてメイクに伝える必要があります。たとえば、lex.yy.cspec.l に依存します。

lex.yy.c: spec.l
    flex spec.l

最初の行はlex.yy.cに依存していspec.lます。2 番目は、更新されたバージョンのlex.yy.cwhen spec.lis newer を生成する方法を示します。このパターンを他のファイルでもほぼ繰り返します。の場合calledspec.y、同じ入力/コマンドから生成される 2 つの結果があります。少なくとも GNU make では、次のように指定できます。

spec.tab.c spec.tab.h: calledspec.y
    bison -vd calledspec.y

次に、ヘッダーと C ファイルのファイル.o(またはなど)の依存関係について、ほぼ同じプロセスを繰り返します。.obj

lex.yy.o: lex.yy.c spec.tab.h
   $(cc) -c lex.yy.c

最後に 1 つ: 特に指定しない限り、make は makefile で指定された最初のターゲットをビルドするため、通常は最終的な実行可能ファイルを最初に配置し、その後に他のターゲットを配置する必要があります。

parser: lex.yy.o y.tab.o
    $(cc) -o parser lex.yy.o y.tab.o

lex.yy.o: lex.yy.c spec.tab.h
    $(cc) -c lex.yy.c

等々。ただし、これはターゲットにのみ適用され、マクロには適用されないため、通常、次のようなものがいくつか表示されます。

cflags = -O2

...メイクファイルの先頭。次に、コンパイラを呼び出す行は、次のようなものを使用します。

lex.yy.o: lex.yy.c spec.tab.h
    $(cc) $(cflags) -c lex.yy.c

そして、これが実行されると、cflagsマクロが展開されるため、実行されるコマンドは次のようになりますgcc -O2 -c lex.yy.c(そして、通常使用することが期待されるコンパイラの名前に事前定義さccれているため、Microsoft の make はそれをcl、GNUgccなどに設定します)。

于 2012-11-30T05:08:52.730 に答える