首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >flex编译问题,链接到libfl失败。

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

Stack Overflow用户
提问于 2016-01-18 19:59:01
回答 2查看 1.7K关注 0票数 0

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

我一直收到一个与未定义的对error ()的引用相关的错误。手册建议:

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

在我的例子中,链接到libfl失败。另外两个选项产生了成功的编译。

有关守则:

test.ll

代码语言:javascript
运行
复制
%option c++

%%

%%

test.c

代码语言:javascript
运行
复制
int main()
{
    return 42;
}

使用以下方法编译这些文件:

代码语言:javascript
运行
复制
flex test.ll
g++ -c lex.yy.cc 
g++ -o test test.c lex.yy.o -lfl

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

在我的例子中,编译的最后一步失败了,我得到:

代码语言:javascript
运行
复制
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'
EN

回答 2

Stack Overflow用户

发布于 2016-01-18 21:43:10

当您使用option c++时,必须将you定义为yyFlexLexer类的一部分:int yyFlexLexer::yywrap();。另外,别忘了C++的名字会乱七八糟。如果您真的想调用libfl中定义的yywrap版本,可以使用以下代码。它按照flex生成的代码所期望的那样将yywrap定义为类的一部分,并且这个成员函数调用libfl提供的原始yywrap函数。但实际上,我看不出有什么理由您可能想使用原始的yywrap函数:如果您不需要任何魔法,可以使用选项noy环绕,或者用所有所需的魔法单独实现y密封件。

代码语言:javascript
运行
复制
%option c++ 

%%

%%

extern "C" {
  int yywrap();
}

int yyFlexLexer::yywrap() {
  return ::yywrap();
}
票数 0
EN

Stack Overflow用户

发布于 2016-07-04 10:05:34

在交叉编译伤寒的OpenFOAM时,我也遇到了同样的错误。OpenFOAM依赖于flex库,因此我需要交叉编译它以供Xepnphi使用。因此,当我尝试交叉编译xeonphi的flex时,它在交叉编译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是在其中定义的(它显示了text选项)。我想知道我是否正确地编译了flex。请告诉我能做些什么

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34863056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档