我的程序使用记录的autoconf宏AM_PROG_LEX
。它在RHEL 6.5
和其他发行版上构建正常,但在RHEL 6.6
及更高版本上失败。
configure脚本无法编译其测试。当它使用-ll
,-lfl
尝试gcc时,链接将失败:
/usr/bin/ld: cannot find -lfl
当它尝试没有额外库的gcc时,链接失败:
undefined reference to `yywrap'
这些系统的官方回购中缺少 libfl.a
或libfl.so
。在RHEL 6.5上,它是flex
包的一部分。
RHEL 6.5
configure:5334: checking whether yytext is a pointer
configure:5351: gcc -o conftest -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -O0 conftest.c -lfl >&5
configure:5351: $? = 0
configure:5359: result: yes
RHEL 6.8
configure:5196: checking whether yytext is a pointer
configure:5217: gcc -o conftest -g -O2 conftest.c >&5
/tmp/ccNJtVgv.o: In function `input':
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/lex.yy.c:1168: undefined reference to `yywrap'
/tmp/ccNJtVgv.o: In function `yylex':
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/lex.yy.c:867: undefined reference to `yywrap'
/tmp/ccNJtVgv.o: In function `main':
/home/git/rpmbuild/BUILD/snacc-1.3.1_16_g23ba7a6/conftest.l:17: undefined reference to `yywrap'
collect2: ld returned 1 exit status
configure:5224: $? = 1
configure: failed program was:
...
configure:5246: result: no
答案 0 :(得分:2)
libfl
包含两个且仅有两个函数,这两个函数在生产中使用flex通常是不必要的:
int main() { extern int yylex(void); while (yylex()) ; return 0; }
int yywrap(void) { return 1; }
如果使用选项
,则不需要yywrap
实现(基本上禁用yywrap功能)
%option noyywrap
在flex定义中,或者如果将命令行选项--noyywrap
传递给flex。
对于快速和脏的弹性扫描仪,或者用于调试,有时可以使用libfl
来填写上述功能。但它也会在提供32位和64位环境的系统上产生问题。因此,2014年已从RHEL libfl
rpm中删除flex
。有关详细信息,请参阅此RedHat bug fix advisory。
因此,您可以安装相应的flex-devel
rpm以使libfl
可用。或者你可以使用上面的代码自己编译它(它不是正好你在flex源代码包中找到的源代码,但应该生成完全相同的库)。
或者您可以尝试修复autoconf,使其不依赖libfl
。它曾经没有任何这样的依赖;如果它找不到libfl
,它只会假设编译程序不需要它。
答案 1 :(得分:0)
解决方法是安装包含!s
的{{1}}包。 RHEL版本可供订阅者使用。替代方案是CentOS包或从源代码重新编译。