dyld:懒符号绑定失败:未找到符号:_yylex

时间:2017-04-10 04:22:13

标签: c++ macos compiler-construction flex-lexer

我是新手flex和bison,在我的Mac上,我使用这些在我的Mac上安装flex和bison:

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 个答案:

答案 0 :(得分:1)

如果您打算使用C ++,您会发现更容易使您的flex扫描程序自包含,而不是依赖于假设C链接的libfl

在第一个%option noyywrap之前添加%%(但请参见下文),以避免需要yywrap并在第二个{{后}添加简单的main 1}}:

%%

我个人更喜欢:

int main() {
  while (yylex()) {}
  return 0;
}

如果您不使用%option noinput nounput noyywrap nodefault -Wall,前两个选项可以使用input()进行编译,如果您的扫描仪无法识别,最后一个选项会导致flex抱怨一些输入。在这种情况下,它会标记一个事实,即扫描仪无法对非字母数字字符进行操作,只是将它们回显到标准输出。 (但也许这是故意的。)