编译gcc 4.6时出现问题:undefined reference to `yylex'。

36

我正在尝试构建gcc 4.6,但是我遇到了一些链接器错误,看起来好像是bison或flex没有被链接。当makefile发出这个命令时:

gcc   -g -fkeep-inline-functions -DIN_GCC   -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wmissing-format-attribute -pedantic -Wno-long-long -Wno-variadic-macros -Wno-overlength-strings -Wold-style-definition -Wc++-compat -fno-common  -DHAVE_CONFIG_H -DGENERATOR_FILE  -o build/gengtype \
        build/gengtype.o build/errors.o build/gengtype-lex.o build/gengtype-parse.o build/version.o ../../build-x86_64-unknown-linux-gnu/libiberty/libiberty.a

它告诉我:

/home/chris/code/gcc/trunk/host-x86_64-unknown-linux-gnu/gcc/../.././gcc/gengtype.c:960: undefined reference to `lexer_line'
... undefined reference to `yylex'
... undefined reference to `yybegin'
... undefined reference to `yyend'

我安装了Flex和Bison,甚至尝试了几个Bison变体,但结果都一样。有人知道这可能意味着什么吗?


你使用过哪些版本的flex,bison和其他工具?每次尝试时是否出现相同的错误?一些Google找到的旧讨论对_gengtype.c未定义引用“lexer_line”...未定义引用“yylex”指向flex可能存在问题。你是从svn主干构建的吗?还是从某个发行版的源代码库构建的? - vpit3833
我也遇到了同样的问题。这是一种bug吗?第一次安装会出现问题吗? - Aman Deep Gautam
3个回答

53

我也遇到了同样的问题,原因是缺少flex和bison。安装了这两个软件之后,我运行了make distclean./configure,然后成功编译了。


8
好的,以下是翻译的结果:啊哈,执行“make distclean”。我之前尝试过执行“make clean”,但没有起作用。我本来想按照@Chris建议的彻底清除一切的方法,但这个方法同样有效。 - Adam Rosenfield
为记录,这是标准Ubuntu安装(11.04)的修复方法。 - Hooked
3
gcc的安装文档建议不要在源目录中运行configure。如果您从不同的目录运行../gcc-srcdir/configure,则源目录保持不变,您只需删除整个obj目录即可。这比“make distclean”更可靠(也更快)。 - Jonathan Wakely
3
为什么configure不会警告缺少flex?它在处理GMP时非常挑剔! - Ciro Santilli OurBigBook.com

3

我也遇到了这个问题,但是对我来说解决方法是安装bisonc++,不知道为什么我只安装了bison。


我不明白为什么这个被踩了,这对我尝试编译gcc 6快照有帮助。 - Luke Antins

2

在我正确安装 bison 和 flex 之前,当我执行 ./configure 并尝试构建时,它进入了一种奇怪的状态。仅仅运行 make clean 是不够的。我清除了整个项目并重新检出,现在可以成功构建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接