升级到 11.10 后无法再构建 gcc

升级到 11.10 后无法再构建 gcc

周一,我从 Ubuntu 11.04(我的初始安装)升级到 11.10,现在我无法再从源代码构建 gcc。由于我在升级前忘记卸载 gcc 包,Ubuntu 用稳定的 4.6.1 替换了我的 4.7.0 编译器。所以我尝试再次构建 SVN 源,但失败了。我最近尝试使用 SVN 修订版 180193。

一段时间后,构建失败并显示以下消息:

/home/raphael/devel/gcc/build/./gcc/xgcc -B/home/raphael/devel/gcc/build/./gcc/ -B/usr/i686-pc-linux-gnu/bin/ -B/usr/i686-pc-linux-gnu/lib/ -isystem /usr/i686-pc-linux-gnu/include -isystem /usr/i686-pc-linux-gnu/sys-include    -g -O2 -O2  -I. -I. -I../../src/gcc -I../../src/gcc/. -I../../src/gcc/../include -I../../src/gcc/../libdecnumber -I../../src/gcc/../libdecnumber/bid -I../libdecnumber -I../../src/gcc/../libgcc -g -O2 -DIN_GCC   -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include  -fPIC -g -DHAVE_GTHR_DEFAULT -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector   -I. -I. -I../.././gcc -I../../../src/libgcc -I../../../src/libgcc/. -I../../../src/libgcc/../gcc -I../../../src/libgcc/../include -I../../../src/libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT -DHAVE_CC_TLS  -DUSE_TLS -o _ashldi3.o -MT _ashldi3.o -MD -MP -MF _ashldi3.dep -DL_ashldi3 -c ../../../src/libgcc/../gcc/libgcc2.c \
    -fvisibility=hidden -DHIDE_EXPORTS
In file included from /usr/include/stdio.h:28:0,
             from ../../../src/libgcc/../gcc/tsystem.h:88,
             from ../../../src/libgcc/../gcc/libgcc2.c:29:
/usr/include/features.h:323:26: fatal error: bits/predefs.h: File or directory not found.

我已将其与以下内容组合:

~/devel/gcc/build$ ../src/configure --prefix=/usr --enable-languages=c++

并使其:

~/devel/gcc/build$ make -j4

为了确保万无一失,我rm -rf * 在构建目录中做了一个检查,以防里面有损坏的东西。然而,这并没有帮助。


这就是背景故事。我尝试修复它并搜索了bits/predefs.h。它在里面/usr/include/i386-linux-gnu。我通过执行以下操作暂时解决了该问题

~/devel/gcc/build$ C_INCLUDE_PATH=/usr/include/i386-linux-gnu make -j4

这只是暂时的,因为现在 gcc 抱怨它找不到crti.o

我可以找到/usr/lib/i386-linux-gnu现在我可以也设置了C_LIBRARY_PATH- 实际上它不起作用 - 但我觉得我在这里与系统作斗争。此外,即使成功了,我新建的编译器也不会知道这些i386-linux-gnu东西。所以我必须在每次构建我拥有的每个项目之前设置C_LIBRARY_PATHC_INCLUDE_PATH。我可以将它添加到我的 .bashrc 中,但这会破坏系统

那么,我该如何讲述构建过程:

  • 有额外的 include/lib 目录,以及
  • 它也应该建立一个尊重它们的 gcc 吗?

编辑:我忘记包含导致上述错误消息的命令。此外,我还能想到另一种解决方案:将内容从复制/usr/include/i386-linux-gnu到(对于to/usr/include也是一样)。但这也感觉不对。最后,系统的 gcc 4.6.1 可以很好地编译其他应用程序,除了我的应用程序,它使用了 4.6 系列中不存在的 C++11 功能。/usr/lib/i386-linux-gnu/usr/lib

答案1

应用此补丁,并使用 --enable-multiarch 进行配置(不要与多混淆):

(取代这个早期的补丁

答案2

更多资料请访问:

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=644986

与使用整个脚本相比,关键部分似乎是:

make FLAGS_FOR_TARGET="-B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu"

结果并不完全干净,因为安装后仍需要一个包装脚本来使用正确的附加选项执行。例如,这是来自文章 /usr/bin/gcc-4.7 的示例:

#!/bin/sh

exec /opt/gcc-4.7/bin/gcc-4.7 -B/usr/lib/i386-linux-gnu -I/usr/include/i386-linux-gnu "$@"

答案3

Ubuntu 11.10 带来多架构支持,这意味着您不应该放入库文件,/usr/lib而是/usr/lib/i386-linux-gnu(32 位)或/usr/lib/x86_64-linux-gnu(64 位)。

使用类似:

CFLAGS=-I/usr/include/i386-linux-gnu ./configure [options]

您可能也需要指定LDFLAGS=-L/usr/lib/i386-linux-gnu

另外:您的路径看起来不太漂亮:/usr/i686-pc-linux-gnu/lib/,您可能需要使用类似的选项--libdir来纠正它。

答案4

由于您是从 SVN 构建的,您确定您是从同一修订版构建的吗?也就是说,确保问题不在上游 :-)

相关内容