为什么我的flex / yacc编译器无法在另一台Linux机器上正确编译

时间:2009-11-18 08:03:51

标签: gcc yacc bison

在我的机器上(运行cygwin的Windows),它正确编译。 Flex版本为2.5.35,野牛版本为2.3

在linux机器1上,它正确编译。 Flex是版本2.5.4,野牛版本是1.875c。

在linux机器2上,它无法正确编译。 Flex是版本2.5.4,野牛是2.3。

通过查看flex / bison版本号可以预期,如果它在我的机器上正确编译,它将在机器2上正确编译,但事实并非如此。

在linux机器2上,当我运行gcc -c y.tab.c时,我多次收到以下警告

警告:内置函数'printf'的不兼容隐式声明

当我运行以下

gcc -o cminus y.tab.o lex.yy.o -ly -lfl

我收到以下错误。

gcc -o cminus y.tab.o lex.yy.o -ly -lfl
/usr/bin/ld: cannot find -ly
collect2: ld returned 1 exit status
make: *** [cminus] Error 1

可以通过取出gcc中的-ly选项来删除此错误,以便程序编译,但编译的程序无法正常运行,就像在我的机器和其他linux机器上一样。

可能导致问题的原因是什么?

2 个答案:

答案 0 :(得分:3)

/usr/bin/ld: cannot find -ly

是链接器找不到库时收到的消息。

您需要找到liby.a或liby.so,然后在-L<that path>命令行中插入gcc

在我的Cygwin安装中,它位于/lib/liby.a,所以我会使用类似的东西:

gcc -o cminus y.tab.o lex.yy.o -L /lib -ly -lfl

答案 1 :(得分:0)

警告听起来好像你在某个源文件中缺少'#include'。链接错误意味着您的计算机上没有安装liby.a. liby是yacc和bison的一些版本的一部分,但实际上很少需要它(它只定义了yyerror和其他一些东西的默认实现)。它没有它的链接这一事实意味着你并不真正需要它。

当没有正确运作时,你没有说过程序员行为不当,所以很难诊断