【问题标题】:flex compilation issue, linking to libfl failsflex 编译问题,链接到 libfl 失败
【发布时间】:2016-01-18 19:59:01
【问题描述】:

我正在尝试从this question 编译最小示例。

我不断收到与未定义的 yywrap() 引用相关的错误。 manual 建议:

  • 定义我自己的yywrap() 函数,或者
  • 使用noyywrap选项,或
  • 链接到libfl.so

就我而言,链接到libfl 失败。其他两个选项会产生成功的编译。


有问题的代码:

test.ll

%option c++

%%

%%

test.c

int main()
{
    return 42;
}

编译这些文件:

flex test.ll
g++ -c lex.yy.cc 
g++ -o test test.c lex.yy.o -lfl

然后,在运行./test 之后,echo $? 应该返回 42。

就我而言,编译的最后一步失败了,我得到:

lex.yy.o:(.rodata._ZTV11yyFlexLexer[_ZTV11yyFlexLexer]+0x68): undefined reference to `yyFlexLexer::yywrap()'
/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/../../../../lib/libfl.so: undefined reference to `yylex'

【问题讨论】:

    标签: c++ linker flex-lexer


    【解决方案1】:

    当您使用option c++ 时,yywrap 必须定义为 yyFlexLexer 类的一部分:int yyFlexLexer::yywrap();。也不要忘记 C++ 会破坏名称。如果你真的想调用 libfl 中定义的 yywrap 版本,你可以使用下面的代码。它将 yywrap 定义为 flex 生成的代码所期望的类的一部分,并且该成员函数调用 libfl 提供的原始 yywrap 函数。但实际上我看不出你有什么理由要使用原始的 yywrap 函数:如果你不需要任何魔法,要么使用选项 noyywrap,要么使用所有必需的魔法自行实现 yywrap。

    %option c++ 
    
    %%
    
    %%
    
    extern "C" {
      int yywrap();
    }
    
    int yyFlexLexer::yywrap() {
      return ::yywrap();
    }
    

    【讨论】:

    • 您好,感谢您的回答。我最初的问题的灵感来自我遇到的一个开源代码问题,该代码无法在我的系统上编译。经过一些测试,我决定构建一个最小的工作示例来测试,如果 flex 是我的问题的根源。在我的最小示例中,我注意到链接到 libfl 失败,这让我很好奇。
    • 现在 g++ 抱怨对 yylex 的未定义引用
    【解决方案2】:

    当我为 xeonphi 交叉编译 OpenFOAM 时,我也遇到了同样的错误。 OpenFOAM 依赖于 flex 库,所以我需要为 Xepnphi 交叉编译它。因此,当我尝试为 xeonphi 交叉编译 flex 时,它在交叉编译 flex 时没有显示任何错误。但是当我编译 OpenFOAM 时出现错误“libfl.so: undefined reference to `yylex”。所以我查看了 libfl.a 和 linfl.so 以查找是否存在定义。我在 libfl.a 和 libfl.so 中找不到 yylex 的定义(objdump --syms libfl.a 为 yylex 函数显示 UND)。如果我检查 objdump --syms yylex.o,它显示 yylex 已在其中定义(它显示了文本选项)。我想知道我是否正确编译了 flex。请告诉我可以做什么

    【讨论】:

      猜你喜欢
      • 2020-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-18
      • 1970-01-01
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多