dyld:惰性符号绑定失败:找不到符号:_yylex

dyld: lazy symbol binding failed: Symbol not found: _yylex

我是 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

有人可以解释并帮助我修复吗?

如果您打算使用 C++,您会发现使 flex 扫描器自包含更容易,而不是依赖 libfl,这假定 C 链接。

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

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

个人比较喜欢:

%option noinput nounput noyywrap nodefault

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