Flex 编译问题,链接到 libfl 失败
flex compilation issue, linking to libfl fails
我正在尝试编译这个问题中的最小示例。
我不断收到与对 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。请让我知道可以做什么
- 如果没有malloc,链表实现将失败
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- 视图中的参数推导失败:take_while
- 链接到自行创建的dll失败
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- GetShortPathName在网络驱动器上使用中文文件夹时失败
- gcc和c++17的过载解析失败
- 为什么使用 P/Invoke 调用 dll 时,某些计算机中的 LoadLibrary 失败?
- 在WSL:configure_file上对config_file的每次调用都失败:配置文件时出现问题
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 从父数组测试用例构造二叉树失败
- LibGit2 SSH身份验证失败
- 如何让LLDB在成功时退出,在失败时等待
- VS2017,C++包含目录与附加包含目录,子文件夹包含失败-但为什么
- 生成MRPT库时cmake配置失败
- 为什么除非添加括号,否则构造函数上的模板替换会失败?
- Flex 编译问题,链接到 libfl 失败