自升级到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 

可以肯定的是,我在build目录中做了一个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的东西复制到/usr/include/usr/lib/i386-linux-gnu/usr/lib )。 但这也感觉不对。 最后,系统的gcc 4.6.1可以很好地编译其他应用程序,除了我的,它使用4.6系列中没有的C ++ 11特性。

应用此补丁,并使用–enable-multiarch配置(不要与multi lib混淆):

(这取代了之前的补丁 。)

更多资料来自:

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 "$@" 

Ubuntu 11.10带来了多arch支持,这意味着你不应该把库文件放在/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这样的选项来纠正它。

从你的SVN建筑开始,您确定您的建筑是否来自同一版本? AKA,确保问题不在上游:-)