编译Jonesforth时出现错误 - asm/unistd.h:没有那个文件或目录。

3

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

~/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引用的头文件?

2
你是否已经安装了 build-essential?它应该依赖于 linux-libc-dev,其中包含 /usr/include/x86_64-linux-gnu/include/asm/unistd.h(其中包括 unistd_64.hunistd_32.h,或 x32,取决于 -m32 是否存在)。可能是 在Ubuntu上编译C代码时遇到问题。(#include错误) 的重复。 - Peter Cordes
@PeterCordes 你好 Peter!是的,看起来我已经安装了它。在 apt list --installed 的结果中,我看到了以下内容:build-essential/xenial,now 12.1ubuntu2 amd64 [installed] - dharmatech
@PeterCordes 我在 make 配置中添加了以下内容:-I /usr/include/x86_64-linux-gnu。这似乎解决了问题!谢谢! - dharmatech
那么我猜我的下一个问题是,这是获取这些头文件的“惯用”方式吗?也就是说,将该特定路径添加到GCC包含路径中? - dharmatech
1
我认为asm/unistd.h应该在标准的包含路径中。如果在.c或.S文件中使用#include <asm/unistd.h>无法正常工作,则说明某些配置存在问题或有错误。在我的Arch Linux系统和旧的Ubuntu 15.10系统上,使用gcc -c -m32 uni.S命令可以正常工作。我使用strace -f gcc ...进行了检查,并且它将/usr/include/i386-linux-gnu/作为gcc -m32的包含路径之一。也许较新版本的Ubuntu配置不同,但我的Arch系统已经更新到最新版本。 - Peter Cordes
2个回答

5

-I /usr/include/x86_64-linux-gnu添加到make文件中似乎解决了这个问题:

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

感谢上面Peter Cordes的建议!


2
这是不正确的!这个文件是用于64位汇编的,当与32位汇编一起使用时会导致错误的代码。让我回家后查找正确的解决方案。 - fuz
1
@fuz:这是一个目录,其中包含 unistd_32.hunistd_64.hunistd_x32.h,还有一个 unistd.h,它会根据当前模式有条件地包含正确的头文件(每个头文件与 /usr/include/i386-linux-gnu 中的内容相同)。在我的系统上,gcc 会自动设置 -I 路径以包括 /usr/include/i386-linux-gnu/usr/include/x86_64-linux-gnu,具体取决于 -m32 还是 -m64。因此,它可能会为其他文件获取错误的头文件,但不会为 unistd.h 获取错误的头文件。(在这两个路径下的 asm 目录之间进行 diff -ur,找不到任何差异。) - Peter Cordes
1
@PeterCordes 我相信 OP 只需要安装适当的 32 位支持文件。让我再检查一下。 - fuz
1
关于OSX呢?(我可以提出一个单独的问题,但这是第一个搜索引擎结果) - Petrus Theron

4

你需要安装 multilib 软件包。


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