【问题标题】:asm/errno.h: No such file or directoryasm/errno.h: 没有这样的文件或目录
【发布时间】:2013-01-25 13:53:29
【问题描述】:

在构建 gcc 时,我收到此错误:

In file included from /usr/include/bits/errno.h:25,
             from /usr/include/errno.h:36,
             from ../.././gcc/tsystem.h:96,
             from ../.././gcc/crtstuff.c:68:
/usr/include/linux/errno.h:4:23: error: asm/errno.h: No such file or directory
make[2]: *** [crtbegin.o] Error 1
make[2]: Leaving directory `/opt/gcc-4.1.2/host-x86_64-unknown-linux-gnu/gcc'

我正在从源代码构建 gcc 4.1。我想我必须安装build-essential。但是在 ubuntu 12.04 中安装该软件包会自动下载并安装 gcc 4.6,我不希望这样。

还有其他方法吗?

【问题讨论】:

  • 当我在 x86 sles1032bit 上交叉编译 s390 时出现同样的问题 在 /var/tmp/toolchain/experiment_2/sysroot.s390x/usr/include/errno.h:35:0 包含的文件中,来自 / var/tmp/toolchain/experiment_2/gcc-4.8.5/libgcc/../gcc/tsystem.h:93,来自/var/tmp/toolchain/experiment_2/gcc-4.8.5/libgcc/libgcc2.c:27 : /var/tmp/toolchain/experiment_2/sysroot.s390x/usr/include/bits/errno.h:24:26: 致命错误: linux/errno.h: No such file or directory #include ^ 编译终止。 make[4]: *** [_negdi2.o] 错误 1

标签: linux gcc


【解决方案1】:

我认为你想要的包是 linux-libc-dev 。我在构建 32-on-64 时遇到了这个问题;所以我需要linux-libc-dev:i386。

【讨论】:

  • 两者都安装在 Ubuntu 15.10 上,diff -ur /usr/include/x86_64-linux-gnu/asm/ /usr/include/i386-linux-gnu/asm/ 显示没有差异。两个软件包都提供了这些目录之外的一些其他文件,但显然这没问题,而且您只有这 62 个文件的多个副本,总计约 340k。 dpkg -L linux-libc-dev | diff -ur - <(dpkg -L linux-libc-dev:i386) 表明两个包在特定于架构的包含目录之外提供相同的文件。
  • 因此,如果您要进行符号链接而不是通过在 64 位系统上安装 linux-libc-dev:i386 来让包管理器满意,请使用 ln -s x86_64-linux-gnu /usr/include/i386-linux-gnu 进行相对符号链接。
  • 谢谢!我在构建 LLVM 的 compiler-rt 时遇到了这个问题。我错过了linux-libc-dev:i386。
【解决方案2】:

这对我有用:

ln -s /usr/include/asm-generic /usr/include/asm

【讨论】:

  • 确实,它看起来与您执行apt-get install gcc-multilib(apt-file search /usr/include/asm 显示此软件包)和在我的系统上安装该软件包时所获得的相似,/usr/include/asm 是一个符号链接。不确定这个包是否依赖于build-essential。
【解决方案3】:

这对我有用:

sudo ln -s /usr/include/asm-generic /usr/include/asm

原因是 GCC 期望被称为 /usr/include/asm 在某些发行版中被重命名为 /usr/include/asm-generic。

【讨论】:

  • 谢谢。我想没有人关心它来修复它。他们不是跨发行版运行自己的安装程序吗?
  • 是的,我可以确认这对我运行 n0000bunt00 有效。
【解决方案4】:

这为我解决了问题。

sudo apt-get install linux-libc-dev:i386

【讨论】:

  • E: 找不到包 linux-libc-dev:386
【解决方案5】:

这在 Debian 10 上为我解决了这个问题,即使我使用基于 LLVM 的编译器进行编译:

sudo apt install gcc-multilib

【讨论】:

    【解决方案6】:

    /usr/include/asm/errno.h 是 linux 头文件的一部分。我不能直接与 Ubuntu 12.04 交谈,但一般来说,您可以将 linux 源代码下载为您的发行版的软件包,并且它不应该要求您下载/安装 gcc。如果做不到这一点,您可以手动下载内核版本 (uname -a) 的 linux 头文件,并使用 CFLAGS 的包含指令来指定要查找的目录。

    编辑:sudo apt-get install linux-headers-generic 可能对你有用。

    【讨论】:

    • 我的内核是 3.2.0-24-generic。 apt-get install linux-headers-3.2.0-2 表示已安装。 apt-get install linux-headers-generic 会下载 linux-headers-3.2.0-37 这是错误的
    • 我会尝试一些事情。一个是find /usr/include -name errno.h,查看它是否隐藏在特定于版本的目录中。另一种是查看/usr/src/,看看你是否下载了内核源;如果没有,看看是否有一个包可以下载它(比如 linux-sources 可能吗?)。找到后,用 CFLAGS -I/path/to/src/include 指向它。
    【解决方案7】:

    您缺少部分开发包。我不知道Ubuntu,但是你应该可以问它的包管理系统来安装包含/usr/include/asm/errno.h的包。

    不要从系统上的某个地方(或者,更糟糕的是,从其他地方)复制一些具有相似名称的文件。丢失文件可能意味着某些包已损坏;再次,请您的包管理器检查所有内容并(重新)安装丢失/损坏的部分。

    除非您正在运行某些 LTS 版本,否则请升级。你的 Ubuntu 已经有 2 年的历史了,也就是说,很古老。

    当我们在这里的时候,为什么在这个美丽的星球上,你要构建这样一个古老的编译器?当前的 GCC 刚刚发布 4.9.0,4.7 之前的任何内容都是古老的历史,不再支持。

    【讨论】:

      【解决方案8】:

      在 Ubuntu 16.04 x86_64 上你可以试试这个:

      ln -s /usr/include/x86_64-linux-gnu/asm /usr/include/asm
      

      这适用于我的服务器。

      【讨论】:

        【解决方案9】:

        如果要使用 asm 文件中的 errno.h,只需转到 /usr/(ctrl + l,键入 /usr/),然后搜索 errno.h 和 errno-base.h。找到它们后,复制这两个文件中的代码,并将它们放在包含文件夹中。请注意,在“errno.h”文件中包含“errno-base.h”为:

        #include <asm-generic/errno-base.h>
        

        要么创建一个上面同名的目录,要么把上面的代码改成适合你使用的不同的东西。

        【讨论】:

          【解决方案10】:

          如果你能找到:

          usr/include/asm-generic/errno.h

          通过执行:

          find /usr/include -name errno.h

          然后尝试执行:

          cp --archive /usr/include/asm-generic /usr/include/asm

          它可能会解决这个问题。

          【讨论】:

            【解决方案11】:

            我在编译 Asterisk 1.8.24.0 时遇到了这个问题,并通过以下方式解决了它:

            mkdir /usr/include/asm-generic
            cp /usr/include/asm/errno-base.h /usr/include/asm-generic/
            

            不知道这是否是“正确的方法”,但我已经阅读了上面的 cmets,这给了我这个想法……它奏效了 :)

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2010-12-29
              • 1970-01-01
              • 2021-06-24
              • 1970-01-01
              • 2015-02-20
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多