web-dev-qa-db-ja.com

yywrapへの未定義の参照

Flex(Lexical Analyzer)を使用している簡単な「言語」があります。これは次のようなものです。

_/* Just like UNIX wc */
%{
int chars = 0;
int words = 0;
int lines = 0;
%}

%%
[a-zA-Z]+ { words++; chars += strlen(yytext); }
\n        { chars++; lines++; }
.         { chars++; }
%%

int main()
{
    yylex();
    printf("%8d%8d%8d\n", lines, words, chars);
}
_

_flex count.l_を実行すると、エラーや警告なしですべてが正常になり、_cc Lex.yy.c_を実行しようとすると、このエラーが発生しました。

ubuntu @ eeepc:〜/ Desktop $ cc Lex.yy.c
/tmp/ccwwkhvq.o:関数yylex': Lex.yy.c:(.text+0x402): undefined reference to yywrap '
/tmp/ccwwkhvq.o:関数input': Lex.yy.c:(.text+0xe25): undefined reference to yywrap '
collect2:ldが1つの終了ステータスを返しました

何が問題なのですか?

74
Nathan Campos

スキャナはファイルの終わりでこの関数を呼び出すため、別のファイルをポイントして、そのコンテンツのスキャンを続行できます。これが必要ない場合は、

%option noyywrap

yywrapを無効にすることは確かに最良のオプションですが、-lflとリンクして、ライブラリのデフォルトのyywrap()関数を使用することもできますfl(つまりlibfl.a)flexによって提供されます。 Posixでは、リンカフラグ-llを指定してライブラリを使用可能にする必要があり、デフォルトのOS Xインストールではその名前のみが提供されます。

120
hjhill

独自のyywrap()を定義することを好みます。私はC++でコンパイルしていますが、ポイントは明らかです。誰かが複数のソースファイルを使用してコンパイラを呼び出す場合、それらをリストまたは配列に保存し、各ファイルの最後でyywrap()を呼び出して、新しいファイルを続行する機会を与えます。

int yywrap() {
   // open next reference or source file and start scanning
   if((yyin = compiler->getNextFile()) != NULL) {
      line = 0; // reset line counter for next source file
      return 0;
   }
   return 1;
}
9
codenheim

flexは常に開発ライブラリとともにインストールされるとは限りません(これは開発ツールであるため、奇妙です)。ライブラリをインストールすると、寿命が延びます。

Redhatベースシステムの場合:

yum -y install flex-devel
./configure && make

Debianベースのシステム

Sudo apt-get install libfl-dev
3
Des Cent

フォロワー2.6.3には、libfl.aがyywrapを「通常」定義するバグがありますが、特定のインスタンスではそうではないため、それがFlexのバージョンであるかどうかを確認してください。

https://github.com/westes/flex/issues/154

2
rogerdpack