gcc 在 i686 上找不到 bits/predefs.h

Posted

技术标签:

【中文标题】gcc 在 i686 上找不到 bits/predefs.h【英文标题】:gcc cannot find bits/predefs.h on i686 【发布时间】:2012-09-25 21:52:41 【问题描述】:

好的,所以,我从 ubuntu 12.04 64 位切换到 32 位并安装了build-essential.

然后我编译并安装了 GMP-5.0.5、MPFR-3.1.1、MPC-1.0、ISL-0.10 和 CLOOG-0.17.0。我检查了主 gcc 主干的副本,并尝试使用以下配置行(来自单独的目录)构建它:

../svnsrc/configure --prefix=/usr/GCC/svn --enable-__cxa_atexit --with-plugin-ld=/usr/bin/ld.gold --enable-threads=posix --enable-werror --enable-build-with-cxx --with-gmp=/usr/GCC/prereq/svn --with-mpfr=/usr/GCC/prereq/svn --with-mpc=/usr/GCC/prereq/svn --with-isl=/usr/GCC/prereq/svn --with-cloog=/usr/GCC/prereq/svn --enable-languages=c,c++

配置运行良好,所以我运行了make && make check。这运行了一段时间,但随后失败并出现以下错误:

/home/matt/GCC/svnbuild/./gcc/xgcc -B/home/matt/GCC/svnbuild/./gcc/ -B/usr/GCC/svn/i686-pc-linux-gnu/bin/ -B/usr/GCC/svn/i686-pc-linux-gnu/lib/ -isystem /usr/GCC/svn/i686-pc-linux-gnu/include -isystem /usr/GCC/svn/i686-pc-linux-gnu/sys-include    -g -O2 -O2  -g -O2 -DIN_GCC   -W -Wall -Wwrite-strings -Wcast-qual -Wstrict-prototypes -Wmissing-prototypes -Wold-style-definition  -isystem ./include   -fpic -mlong-double-80 -g -DIN_LIBGCC2 -fbuilding-libgcc -fno-stack-protector   -fpic -mlong-double-80 -I. -I. -I../.././gcc -I../../../svnsrc/libgcc -I../../../svnsrc/libgcc/. -I../../../svnsrc/libgcc/../gcc -I../../../svnsrc/libgcc/../include -I../../../svnsrc/libgcc/config/libbid -DENABLE_DECIMAL_BID_FORMAT -DHAVE_CC_TLS  -DUSE_TLS -o _muldi3.o -MT _muldi3.o -MD -MP -MF _muldi3.dep -DL_muldi3 -c ../../../svnsrc/libgcc/libgcc2.c -fvisibility=hidden -DHIDE_EXPORTS
In file included from /usr/include/stdio.h:28:0,
                 from ../../../svnsrc/libgcc/../gcc/tsystem.h:88,
                 from ../../../svnsrc/libgcc/libgcc2.c:29:
/usr/include/features.h:324:26: fatal error: bits/predefs.h: No such file or directory
 #include <bits/predefs.h>
                          ^
compilation terminated.
make[3]: *** [_muldi3.o] Error 1
make[3]: Leaving directory `/home/matt/GCC/svnbuild/i686-pc-linux-gnu/libgcc

我环顾四周,但我似乎发现这个错误是在 x86_64 上引起的,因为没有安装 gcc-multilib,因为 Ubuntu 和 Debian 使用 mutiarch 系统,将库分开。好吧,好吧……但我使用的是 i686,那我为什么需要 64 位库呢?任何帮助,将不胜感激。谢谢。

【问题讨论】:

【参考方案1】:

尝试做一个

sudo apt-get install gcc-multilib

我不认为安装 32 位系统会改变您计算机的体系结构,因为您的计算机将始终是 64 位计算机。安装 64 位版本的 Ubuntu 只会提供更好的多核性能。由于您的计算机仍然是 64 位计算机,因此您可能需要一个能够在 64 位计算机上编译的 C 编译器。因此 gcc-multilib。我想。

【讨论】:

我这样做了,虽然它消除了错误,但我得到了一个关于 gnu/stubs-32.h 的新错误,它位于 libc6-dev 中。我只是要回到 64 位 12.04。谢谢!接受是因为它确实消除了错误。 嗯,所以你已经尝试过这样做了? ***.com/questions/7412548/… 64 位与多处理(核心使用)有何关系? 从 32 位到 64 位的主要变化是系统可以使用多少内存,而不是多处理。 32 位系统支持约 2GB 内存,而 64 位系统最多可支持 16 艾字节(虽然技术上 64 位 Intel 和 AMD 机器只能处理 48 位,最大 256 TB,这仍然足够好...... . 暂时)。 @DanAlbert:32 位系统支持基于内核中定义的 PAGE_OFFSET 宏值的 VM 模型(仅在内核构建时可配置(通常通过 CONFIG_VM_SPLIT))。 Linux 上 32 位系统的典型默认设置是“3:1”VM​​ 拆分,这意味着 3GB 用户模式虚拟内存和 1GB 内核模式 VM。可以是 2:2,也可以是 1:3。【参考方案2】:

gcc-multilib 技巧对我不起作用。相反,在构建环境中设置它就可以了:

C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

【讨论】:

由于 gcc-multilib 在 Cubian 上不可用,这解决了我的问题。 - 顺便记住export C_INCLUDE_PATH= ...。 这对我也有用。 gcc-multilib 在 Raspbian 上也不可用。

以上是关于gcc 在 i686 上找不到 bits/predefs.h的主要内容,如果未能解决你的问题,请参考以下文章

单击问题窗口时,在Visual Studio代码上找不到文件错误(使用make,gcc和gcc problemMatcher)

在 centos 上找不到 GLIBCXX_3.4.26

ld:在带有 gcc/clang -static 标志的 OSX 10.6 上找不到 -lcrt0.o 的库

在 Ubuntu 上找不到 Tkinter 模块

在 OS X 上找不到 sndfile.h

g++ -m32 在 debian amd64 上找不到 libstdc++