我正在尝试从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'
答案 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。请让我知道可以做些什么