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

时间:2016-01-18 19:59:02

标签: c++ linker flex-lexer

我正在尝试从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'

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

当我为xeonphi交叉编译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。请让我知道可以做些什么