我正在尝试从这个问题编译最小的示例。
我一直收到一个与未定义的对error ()的引用相关的错误。手册建议:
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'
发布于 2016-01-18 21:43:10
当您使用option c++
时,必须将you定义为yyFlexLexer类的一部分:int yyFlexLexer::yywrap();
。另外,别忘了C++的名字会乱七八糟。如果您真的想调用libfl中定义的yywrap版本,可以使用以下代码。它按照flex生成的代码所期望的那样将yywrap定义为类的一部分,并且这个成员函数调用libfl提供的原始yywrap函数。但实际上,我看不出有什么理由您可能想使用原始的yywrap函数:如果您不需要任何魔法,可以使用选项noy环绕,或者用所有所需的魔法单独实现y密封件。
%option c++
%%
%%
extern "C" {
int yywrap();
}
int yyFlexLexer::yywrap() {
return ::yywrap();
}
发布于 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。请告诉我能做些什么
https://stackoverflow.com/questions/34863056
复制相似问题