14

flex と bison を使用して単純なスクリプト言語を作成しようとしています。今、私は電卓を動かそうとしています。

しかし、私はそれをコンパイルすることはできません。このメイクファイルを実行すると:

OBJECTS = hug.tab.o hug.yy.o
PROGRAM = hug.exe

CPP = g++
LEX = flex
YACC = bison

.PHONY: all clean

all: $(OBJECTS)
$(CPP) $^ -o $(PROGRAM)

clean:
$(RM) *.o *.output *.tab.* *.yy.* $(PROGRAM)

%.tab.o: %.tab.cpp
$(CPP) -c -o $@ $<

%.tab.cpp: %.ypp
$(YACC) -vd $<

%.yy.o: %.yy.c
$(CPP) -c -o $@ $<

%.yy.c: %.l
$(LEX) -o $@ $<

%.o: %.cpp
$(CPP) -c -o $@ $<

.l および .ypp ファイルで、次のエラーが発生します。

undefined reference to `yylex()'

そして、次のallようなコマンドを作成すると:

$(CPP) $^ -o $(PROGRAM) -lfl

見つからなかったと表示されます-lfl。そして、私がこのようにすると:

$(CPP) $^ -o -lfl $(PROGRAM)

エラーに戻りundefined referenceます。

申し訳ありませんが、私はこれについて少し無知です。

編集:フレックスがインストールされています。-lfl から C:/GnuWin32/lib/libfl.a に変更しようとしました (Linux には奇妙な問題があり、まだ Mac を持っていないため、Windows を使用しようとしています)。同じエラー。

4

3 に答える 3

17

問題は、hug.yy.c を gcc ではなく g++ (C++ として扱う) でコンパイルしていることです。これは を定義するファイルyylexなので、これを C++ としてコンパイルすると、他のファイルが C yylex 関数を探している間に C++ yylex 関数になります。

extern "C" int yylex();C++ の代わりに yylex に C リンケージを使用するように、hug.l ファイルの最初のセクションに固執してみてください。

于 2011-12-07T23:18:04.370 に答える
1

フレックスライブラリをインストールしましたか? はいの場合は、次のようなものを試してください

$(CPP) $^ /path/of/flex/lib/libfl.a -o $(PROGRAM)
于 2009-09-27T11:02:35.280 に答える