周一,我从 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_PATH
和C_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 构建的,您确定您是从同一修订版构建的吗?也就是说,确保问题不在上游 :-)