【问题标题】:Error "gnu/stubs-32.h: No such file or directory" while compiling Nachos source code编译 Nachos 源代码时出现错误“gnu/stubs-32.h: No such file or directory”
【发布时间】:2011-11-16 18:33:23
【问题描述】:

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

代码是用 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 os 的源代码时,我得到了这个错误 -

/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。

【问题讨论】:

  • 感谢您的建议,程序现在开始编译但我收到此错误_嗨,现在我遇到此错误 - /usr/bin/ld: skipping incompatible /usr/lib/x86_64- linux-gnu/gcc/x86_64-linux-gnu/4.5.2/libstdc++.a 搜索时 -lstdc++ /usr/bin/ld: 找不到 -lstdc++ collect2: ld 返回 1 退出状态 make: *** [nachos]错误 1 ​​有关如何解决此问题的任何想法?我该怎么办?

标签: ubuntu gcc mips cross-compiling nachos


【解决方案1】:

您缺少 32 位 libc 开发包:

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 - do pacman -S lib32-glibc


您使用的是 Ubuntu 12.04 吗?有a known problem that puts the files in a non standard location。你会also需要做的:

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: 找不到 -lstdc++ ....

Ubuntu 上,您需要执行 sudo apt-get install g++-multilib

CentOS 5 上你需要做yum install libstdc++-devel.i386

CentOS 6 上,您需要执行 yum install libstdc++-devel.i686

请随时在其他系统的包中进行编辑。

【讨论】:

  • 也许我没有找到那个包的原因是我的笔记本电脑是 32 位的......但是我找到了libc-dev-amd64。我的错。
  • 是的,我会说他可能在 64 位机器上,这就是文件丢失的原因。在我的 64 位机器上,stubs.h(他拥有)在 libc6-dev 中,而 stubs-32.h(他没有)在 libc6-dev-i386 中。关于 apt-file 的好提示 - 我不知道 :)
  • 您可以使用sudo apt-get install g++-multilib获取该库的 32 位版本
  • 对于那些在基于 Red Hat 的发行版上遇到此问题的人,该软件包是 glibc-devel.i686(我刚刚做过,这个答案有助于为我指明正确的方向 :)
  • Ubuntu 12.04 上存在一个已知问题,即安装后将此文件置于非标准目录中。这个解决方案最终对我有用gcc.gnu.org/ml/gcc/2012-02/msg00314.html
【解决方案2】:

来自GNU UPC website

编译器构建失败并出现致命错误:gnu/stubs-32.h: No such file 或 目录

此错误消息显示在 GCC/UPC 的 64 位系统上 启用了 multilib 功能,它表示 32 位版本的 未安装 libc。有两种方法可以解决这个问题:

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

【讨论】:

  • 感谢您提供特别有用的答案:--disable-multilib 部分
  • @djhaskin987,gccupc.org 不是源,gcc.gnu.org 是
  • 我在 x64 centos 6.4 上执行了 'yum install glibc-devel.i686'
  • 如何使用基于 autoconf 的 make 系统做到这一点?我试过传递--disable-multilib,但它没有改变任何东西。我没有安装 multilib 包的 root 访问权限。
【解决方案3】:

试试sudo apt-get install libc6-dev

apt-file 告诉我有问题的文件属于那个包。

【讨论】:

  • 感谢您的回答,帮助很大:D
  • 这在多架构机器上是不够的,因为即使您安装了最新版本的 libc6-dev,您仍然会收到此错误。
【解决方案4】:

现在位于 GCC wiki 常见问题解答中,请参阅 http://gcc.gnu.org/wiki/FAQ#gnu_stubs-32.h

【讨论】:

    【解决方案5】:

    嗯,我在 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(精确)中可用,请参阅packages.ubuntu.com/precise/libc6-dev-i386
    • 我在 linux 的 VS Code 上运行时遇到了这个问题。将“/usr/include/x86_64-linux-gnu”添加到 c_cpp_properties.json 文件的 includePath 数组对我来说非常适合。感谢您的回答,我找到了该文件的位置。
    【解决方案6】:

    我在 Fedora 18 机器上遇到以下错误:


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

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

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

    解决方案:

    我安装 (yum install) glibc.i686 glibc-devel.i386 和 libgcc.i686 以摆脱编译问题。

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

    【讨论】:

      【解决方案7】:

      FWIW,在交叉编译时使用 /usr/include 中的文件听起来像是一个错误(或至少是未来痛苦的潜在来源)。

      【讨论】:

      • 我认为他正在尝试构建工具链,而不是与那些包含交叉编译。
      【解决方案8】:

      gnu/stubs-32.h 未定向包含在程序中。是gnu/stubs.h的后端类型头文件,和gnu/stubs-64.h一样。您可以安装 multilib 包来添加两者。

      【讨论】:

        【解决方案9】:

        # sudo apt-get install g++-multilib

        应该在 64 位机器 (Debian/Ubuntu) 上修复此错误。

        【讨论】:

          【解决方案10】:

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

          【讨论】:

            【解决方案11】:

            在 Debian/Ubuntu 上使用:

            sudo apt-get install g++-multilib libc6-dev-i386

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2017-03-08
              • 1970-01-01
              • 1970-01-01
              • 2017-04-24
              • 2023-03-12
              相关资源
              最近更新 更多