2011-06-22 15 views
3

g++で結果のスキャナをコンパイルしようとすると、flexというリンカエラーが発生します。私はflexに、以下の(非常にシンプルな)スクリプトを与える場合:フレックスとg ++のリンカエラー?

%% 
. ECHO; 

をその後、私は次のエラーを取得

として結果のコードをコンパイルしてみてください、その後flex

として
flex++ scanner.l 

を実行し、 :

/tmp/ccD5WdY3.o:(.rodata._ZTV11yyFlexLexer[vtable for yyFlexLexer]+0x28): undefined reference to `yyFlexLexer::yywrap()' 
/usr/lib/libl.a(libmain.o): In function `main': 
/build/buildd/flex-2.5.35/libmain.c:30: undefined reference to `yylex' 
collect2: ld returned 1 exit status 

これはなぜわかりません。間違ったライブラリで-llとリンクしていますか?もしそうなら、私はこれを修正するために何をすべきですか?

+0

私はその話題にはあまりよく慣れていませんが、 'yylex'関数を提供するパーサーも必要としませんか? bison ++を使用していますか? –

+0

Adob​​e Flexでこれをタグ付けしましたか? – JeffryHouser

+0

ああ、私の間違い!一定。 – templatetypedef

答えて

4

あなたが言及したように、私は-llは不要だと思います。

int main() { return yylex(); } 

しかし、flex++によって生成されたスキャナのコードが自立 機能yylexが含まれていません:
はおそらくliblは、次のようなコードが含まれています。 スキャナが上記のmainにリンクされている場合、yylexが見つかりません。
スキャナがflex++によって生成されると、そのスキャナは-llとリンク main専用の代わりを必要とし、最も単純なmainは、以下のようになる:

C++スキャナ、 this partの使用について
int main() { 
    for (yyFlexLexer l; l.yylex();) {} 
} 

flex文書の が役に立ちます。ドキュメントが言うように、言われていること

スキャンクラス の現在の形が実験であると私はCを使用してお勧めすることはできません

メジャーリリースとの間でかなり を変更することができ++スキャナを積極的に使用します。