【问题标题】:Building Jonesforth - asm/unistd.h: No such file or directory构建 Jonesforth - asm/unistd.h:没有这样的文件或目录
【发布时间】:2019-06-07 12:55:08
【问题描述】:

尝试在 Ubuntu 16.04.4 64 位(Xenial Xerus)上构建 Jonesforth(32 位 GNU 汇编程序)时,我看到以下内容:

~/src/jonesforth $ make
gcc -m32 -nostdlib -static -o jonesforth jonesforth.S
jonesforth.S:1154:24: fatal error: asm/unistd.h: No such file or directory
compilation terminated.
Makefile:11: recipe for target 'jonesforth' failed

查看文件jonesforth.S,我注意到以下几行:

//#include <asm-i386/unistd.h>  // You might need this instead
#include <asm/unistd.h>

我尝试改用asm-i386/unistd.h,但这似乎也没有帮助。

通过sudo apt install linux-headers... 安装更多标头是最好的做法吗?如果是这样,我应该选择哪个? linux-headers-generic 是否足够?

或者,我应该更改jonesforth.S 所指的标头吗?

【问题讨论】:

  • 您是否安装了build-essential?它应该取决于包含/usr/include/x86_64-linux-gnu/include/asm/unistd.hlinux-libc-dev(包括unistd_64.hunistd_32.h,或x32,取决于-m32 与否。可能是Having trouble compiling C code on ubuntu. (#include errors) 的重复
  • @PeterCordes 嗨,彼得!是的,看起来我已经安装了它。我在apt list --installed 的结果中看到以下内容:build-essential/xenial,now 12.1ubuntu2 amd64 [installed]
  • @PeterCordes 我在制作配方中添加了以下内容:-I /usr/include/x86_64-linux-gnu。这似乎奏效了!谢谢!
  • 所以我想我的下一个问题是,这是获取这些标题的“惯用”方式吗? IE。将该特定路径添加到 GCC 包含路径?
  • 我认为 asm/unistd.h 应该在标准包含路径中。如果#include &lt;asm/unistd.h&gt;.c.S 文件中不起作用,则说明配置错误或存在错误。它适用于我的 Arch Linux 系统和旧的 Ubuntu 15.10 系统,使用 gcc -c -m32 uni.S。我检查了strace -f gcc ...,它使用/usr/include/i386-linux-gnu/ 作为gcc -m32 的包含路径的一部分。也许以后 Ubuntu 的配置有所不同,但我的 Arch 系统是最新的。

标签: ubuntu gcc assembly gnu-assembler forth


【解决方案1】:

-I /usr/include/x86_64-linux-gnu 添加到make recipe 似乎已经解决了这个问题:

jonesforth: jonesforth.S
        gcc -I /usr/include/x86_64-linux-gnu -m32 -nostdlib -static $(BUILD_ID_NONE) -o $@ $<

感谢以上Peter Cordes的建议!

【讨论】:

  • 这是不正确的!此文件用于 64 位汇编,与 32 位汇编一起使用时会导致错误代码。让我回家后查找正确的解决方案。
  • @fuz:这是一个目录,它包含unistd_32.hunistd_64.hunistd_x32.h,还有一个unistd.h,它有条件地包含当前模式的正确目录。 (每个都与/usr/include/i386-linux-gnu中的内容相同)。我系统上的 gcc 会根据 -m32 或 -m64 自动设置 -I 路径以包含 /usr/include/i386-linux-gnu/usr/include/x86_64-linux-gnu。所以它可能会得到错误的 other 文件头,但不会得到 unistd.h。 (这两个路径下的asm 目录之间的diff -ur 没有发现差异。)
  • @PeterCordes 我很确定 OP 只需要安装适当的 32 位支持文件。让我再检查一下。
  • OSX 怎么样? (我可以问一个单独的问题,但这是第一个搜索引擎结果)
【解决方案2】:

你需要安装包multilib

【讨论】:

    猜你喜欢
    • 2013-01-25
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2012-04-01
    • 2020-04-05
    • 2017-12-19
    相关资源
    最近更新 更多