2017-04-10 7 views
1

私は、私のMac上で、私はこれらを使用して私のMac上でflexとbison撓み新しいとバイソンインストールしています:dyldの:怠惰なシンボル結合に失敗しました:シンボルが見つかりません:_yylex

brew install flex && brew link flex --force 
brew install bison && brew link bison --force 

これは私のtest1ll.lファイルです

%{ 
    #include <iostream> 
    using namespace std; 
%} 
%% 
[0-9]+  { cout << "Number "; } 
[a-zA-Z]+  { cout << "Word "; } 
[ \t]   ; 
%% 

その後、私は次のコマンドを実行します。

flex -otest1ll.c test1ll.l 
g++ test1ll.c -otest1 -lfl 
./test1 

私はこれらのエラーを得た:

dyld: lazy symbol binding failed: Symbol not found: _yylex 
    Referenced from: /usr/local/opt/flex/lib/libfl.2.dylib 
    Expected in: flat namespace 

dyld: Symbol not found: _yylex 
    Referenced from: /usr/local/opt/flex/lib/libfl.2.dylib 
    Expected in: flat namespace 

Abort trap: 6 

誰かが説明して解決することができますか?ありがとうございました。

答えて

1

C++を使用する場合、Cリンケージを前提としたlibflに頼るのではなく、フレックススキャナを自立させる方が簡単です。

最初%%%option noyywrapを追加します(ただし、下記参照)yywrapの必要性を回避し、二%%た後、最後に簡単なmainを追加する:

個人的に
int main() { 
    while (yylex()) {} 
    return 0; 
} 

私が好む:

%option noinput nounput noyywrap nodefault 

最初の2つのオプションは、使用しない場合は-Wallでコンパイルすることができますinput()またはunput()最後のスキャナでは、スキャナが入力を認識できない場合にflexがエラーになることがあります。この場合、スキャナが英数字以外の文字に対応できず、標準出力にエコーされないという事実が示されます。 (しかしそれは意図的だったかもしれません)

関連する問題