编译Nachos源代码时出现错误“gnu/stubs-32.h: No such file or directory”

192

我正在尝试在我的笔记本电脑上安装Nachos,而我的笔记本电脑上安装的是Ubuntu 11.04。

Nachos的代码是用C语言编写的,因此我需要使用交叉编译器来构建它。这就是我的问题所在。我使用以下命令下载MIPS交叉编译器的源代码:

  wget http://mll.csie.ntu.edu.tw/course/os_f08/assignment/mips-decstation.linux-xgcc.gz

我使用以下方法解压缩它:

tar zxvf mips-decstation.linux-xgcc.gz      

这样是可以的,但当我尝试使用make编译nachos操作系统的源代码时,出现了以下错误 -

/usr/include/gnu/stubs.h:7:27: fatal error: gnu/stubs-32.h: No such file or directory compilation terminated. make: *** [bitmap.o] Error 1

我正试图按照这里给出的指示进行操作 - http://mll.csie.ntu.edu.tw/course/os_f08/217.htm,除了当我尝试使用make时一切都正常。


1
谢谢您的建议,程序现在开始编译,但我遇到了这个错误 -嗨,现在我有这个错误 - /usr/bin/ld:在搜索-lstdc++时跳过不兼容的/usr/lib/x86_64-linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libstdc++.a /usr/bin/ld:无法找到-lstdc++ collect2:ld返回1退出状态make:*** [nachos] Error 1 对于如何解决此问题有什么想法吗? 我该怎么办? - Ashish Agarwal
13个回答

409
您缺少32位libc dev软件包:
在Ubuntu上,它被称为libc6-dev-i386-请使用"sudo apt-get install libc6-dev-i386" 命令进行安装。有关Ubuntu 12.04的额外说明,请参见下文。
在Red Hat发行版中,软件包名称为"glibc-devel.i686" (感谢David Gardner的评论)。
在CentOS 5.8上,软件包名称为"glibc-devel.i386"(感谢JimKleck的评论)。
在CentOS 6 / 7上,软件包名称是"glibc-devel.i686"。
在SLES上,它被称为glibc-devel-32bit-请使用"zypper in glibc-devel-32bit" 命令进行安装。
在Gentoo中,它被称为sys-libs/glibc - 执行emerge -1a sys-libs/gcc命令。[source] (注意:可以使用equery确认是否正确;执行equery belongs belongs /usr/include/gnu/stubs-32.h
在ArchLinux中,软件包名称为lib32-glibc - 执行pacman -S lib32-glibc命令。

您是否正在使用Ubuntu 12.04?存在已知问题,会将文件放置在非标准位置。您还需要执行以下操作:

export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch)
export C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)
export CPLUS_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

在构建之前的某个地方(比如在您的 .bashrc 文件中)。


如果您也在编译C++代码,您还需要32位的stdc++库。如果您看到以下警告:
/usr/bin/ld: cannot find -lstdc++
在Ubuntu上,您需要执行sudo apt-get install g++-multilib
在CentOS 5上,您需要执行yum install libstdc++-devel.i386
在CentOS 6上,您需要执行yum install libstdc++-devel.i686
请随意编辑其他系统的软件包。

2
也许我没有找到那个软件包的原因是我的笔记本电脑是32位的...不过我找到了 libc-dev-amd64。是我自己的问题。 - Keith Layne
1
是的,我想他可能在使用64位机器,这就是文件缺失的原因。在我的64位机器上,stubs.h(他有)在libc6-dev中,而stubs-32.h(他没有)在libc6-dev-i386中。apt-file的好建议 - 我以前不知道 :) - Timothy Jones
2
在Ubuntu 12.04上已知存在一个问题,安装后将该文件放置在非标准目录中。最终,这个解决方案对我有用:http://gcc.gnu.org/ml/gcc/2012-02/msg00314.html。 - Eric Chen
在 Fedora 19 上,我不得不安装 glibc-devel.i686 而不是 i386 版本。 - Emmanuel M. Smith
2
fedorasudo dnf install glibc-devel.i686 - Nick Dong
显示剩余4条评论

58

来自GNU UPC网站

编译器构建失败,致命错误:gnu/stubs-32.h:找不到文件或目录

在启用GCC / UPC多库特性的64位系统上会出现此错误消息,提示未安装32位版本的libc。 有两种方法可以解决此问题:

  • 安装32位版本的glibc(例如在Fedora、CentOS上安装glibc-devel.i686)
  • 通过在编译器配置命令中提供“--disable-multilib”开关来禁用'multilib'构建

9
非常感谢您提供特别有用的答案:--disable-multilib 部分。 - necromancer
3
@djhaskin987,gccupc.org 不是源网站,源网站为 gcc.gnu.org。 - Jonathan Wakely
我在x64 centos 6.4上执行了“yum install glibc-devel.i686”。 - plhn
1
你如何在基于autoconf的make系统中实现这个?我尝试了传递--disable-multilib,但它没有改变任何东西。我没有root访问权限来安装multilib包。 - user632657
这解决了我的疑问,即为什么在我的机器是x86_64时我必须指定".i686"架构。 - Changdae Park

9

尝试执行 sudo apt-get install libc6-dev 命令。

apt-file 告诉我该文件属于该软件包。


这在多架构机器上是不够的,因为即使您安装了最新版本的libc6-dev,仍然会出现此错误。 - jeremiah

7

2

我在使用 Fedora 18 时遇到了以下错误:


1. /usr/include/gnu/stubs.h:7:27: 致命错误: gnu/stubs-32.h: 没有那个文件或目录编译终止。

我安装了 glibc.i686 和 glibc-devel.i686,但编译失败并出现以下错误:

2. /usr/bin/ld: 跳过不兼容的 /usr/lib/gcc/x86_64-redhat-linux/4.7.2/libgcc_s.so,当搜索 -lgcc_s 时/usr/bin/ld: 找不到 -lgcc_s collect2: 错误: ld 返回 1 退出状态

解决方案:

我安装了 glibc.i686,glibc-devel.i386 和 libgcc.i686,以解决编译问题。

现在,32 位(-m32)的编译工作正常。


2

嗯,我使用的是Ubuntu 12.04,在尝试编译GCC 4.7.2时遇到了相同的错误。

我尝试安装libc6-dev-i386软件包并出现以下情况:

Package libc6-dev-i386 is not available, but is referred to by another package.
This may mean that the package is missing, has been obsoleted, or
is only available from another source

E: Package 'libc6-dev-i386' has no installation candidate

我还在bash中设置了正确的环境变量:
export LIBRARY_PATH=/usr/lib/$(gcc -print-multiarch)
export C_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)
export CPLUS_INCLUDE_PATH=/usr/include/$(gcc -print-multiarch)

然而,我仍然遇到了错误,然后我简单地将 stubs-32.h 复制到gcc期望找到它的位置,之后进行了快速的比较。

vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ./: stubs-32.h
Only in ../../gnu: stubs-64.h
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ sudo cp stubs-32.h ../../gnu/
[sudo] password for vic: 
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$ diff ../../gnu ./
Only in ../../gnu: stubs-64.h
vic@ubuntu:/usr/include/i386-linux-gnu/gnu$

现在正在编译,请看它是否会有更多的抱怨...


奇怪。这个软件包在12.04(Precise)肯定可用,可以查看http://packages.ubuntu.com/precise/libc6-dev-i386。 - Timothy Jones
在Linux上,我在使用VS Code时遇到了这个问题。将"/usr/include/x86_64-linux-gnu"添加到c_cpp_properties.json文件的includePath数组中对我非常有效。多亏了你的答案,我找到了这个文件的位置。 - Sahin

0

你好,我遇到了同样的问题。当我在MAKEFILE中添加'-D__TARGET_ARCH_x86'时,它起作用了!

错误信息如下:

In file included from /usr/include/string.h:26:
In file included from /usr/include/bits/libc-header-start.h:33:
In file included from /usr/include/features.h:452:
/usr/include/gnu/stubs.h:7:11: fatal error: 'gnu/stubs-32.h' file not found
# include <gnu/stubs-32.h>nter code here

stubs.h 文件中的内容是:

#if !defined __x86_64__
# include <gnu/stubs-32.h>
#endif
#if defined __x86_64__ && defined __LP64__
# include <gnu/stubs-64.h>
#endif
#if defined __x86_64__ && defined __ILP32__
# include <gnu/stubs-x32.h>
#endif

你可以找到真正的原因是缺少宏定义x86_64。编译器必须找到stubs-x32.h。所以,您可以安装32位的glibc来解决问题。但更好的方法是指定架构为64位。在MAKEFILE中,在gcc&g++命令中加入'-D__TARGET_ARCH_x86'即可。


0

gnu/stubs-32.h通常不会被直接包含在程序中。它是gnu/stubs.h的后端类型头文件,就像gnu/stubs-64.h一样。您可以安装multilib软件包来同时添加两个文件。


0

# sudo apt-get install g++-multilib

这条命令可以解决在64位机器上(Debian/Ubuntu)出现的错误。


0
如果您在Mac-OSX终端中使用Python时遇到此问题,请尝试更新您正在使用的软件包版本。因此,转到Python文件以及您指定软件包的位置,并将它们更新为互联网上最新版本。

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