Flex 编译问题,链接到 libfl 失败

flex compilation issue, linking to libfl fails

本文关键字:libfl 失败 链接 编译 问题 Flex      更新时间:2023-10-16

我正在尝试编译这个问题中的最小示例。

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

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

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


有问题的代码:

测试.ll

%option c++
%%
%%

测试.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'

当你使用 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();
}

当我为至强phi交叉编译OpenFOAM时,我也遇到了同样的错误。OpenFOAM依赖于flex库,所以我需要为Xepnphi交叉编译它。因此,当我尝试交叉编译 flex for xeonphi 时,它在交叉编译 flex 时没有显示任何错误。但是当我编译OpenFOAM时,我收到错误"libfl.so:对'yylex'的未定义引用"。所以我研究了libfl.a和 linfl.so,以找出是否存在定义。我在libfl.a和 libfl.so 中找不到yylex的定义(objdump --syms libfl.a显示了yylex函数的UND)。如果我检查objdump --syms yylex.o,它显示yylex在其中定义(它显示了文本选项)。我想知道我是否正确编译了 flex。请让我知道可以做什么