【问题标题】:dyld: lazy symbol binding failed: Symbol not found: _yylexdyld:惰性符号绑定失败:找不到符号:_yylex
【发布时间】:2017-04-10 04:22:12
【问题描述】:

我是 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++ macos compiler-construction flex-lexer


    【解决方案1】:

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

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

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

    我个人更喜欢:

    %option noinput nounput noyywrap nodefault
    

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

    【讨论】:

      猜你喜欢
      • 2011-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-18
      • 2016-04-19
      • 1970-01-01
      相关资源
      最近更新 更多