2

在我的机器(运行 cygwin 的 Windows)上,它可以正确编译。Flex 是 2.5.35 版,bison 是 2.3 版

在 linux 机器 1 上它可以正确编译。Flex 是 2.5.4 版,bison 是 1.875c 版。

在 linux 机器 2 上它不能正确编译。Flex 是 2.5.4 版本,bison 是 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 机器上那样正常运行。

什么可能导致问题?

4

2 回答 2

3
/usr/bin/ld: cannot find -ly

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

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

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

gcc -o cminus y.tab.o lex.yy.o -L /lib -ly -lfl
于 2009-11-18T08:12:32.890 回答
0

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

当程序无法正常运行时,您不会说程序以何种方式行为不端,因此很难诊断

于 2009-11-22T20:38:54.927 回答