Building Jonesforth - asm/unistd.h: No such file or directory
尝试在Ubuntu 16.04.4 64位(Xenial Xerus)上构建Jonesforth(32位GNU汇编程序)时,我看到以下内容:
1 2 3 4 5
| ~/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中,我注意到以下几行:
1 2
| //#include // You might need this instead
#include |
我尝试使用asm-i386/unistd.h代替,但这似乎也无济于事。
通过sudo apt install linux-headers...安装更多标头的最佳做法是吗? 如果是这样,我应该选择哪一个? linux-headers-generic是否足够?
还是应该更改jonesforth.S所指的标头?
-
您是否已安装build-essential?它应该取决于包含usrincludex86_64-linux-gnuincludeasmunistd.h的linux-libc-dev(包括unistd_64.h或unistd_32.h或x32,取决于-m32)。可能是在ubuntu上编译C代码时遇到麻烦的重复。(#include错误)
-
@PeterCordes嗨,彼得!是的,看起来我已经安装了它。我在apt list --installed的结果中看到以下内容:build-essentialxenial,now 12.1ubuntu2 amd64 [installed]。
-
@PeterCordes我在制作配方中添加了以下内容:-I usrincludex86_64-linux-gnu。这似乎可以解决问题!谢谢!
-
所以我想我的下一个问题是,获取这些标头的"惯用"方式是吗?即将该特定路径添加到GCC包含路径?
-
我认为asm / unistd.h应该在标准包含路径中。如果#include 在.c或.S文件中不起作用,则可能是配置错误或错误。它可以在我的Arch Linux系统和旧版Ubuntu 15.10系统(使用gcc -c -m32 uni.S)上运行。我用strace -f gcc ...检查过,它使用usrincludei386-linux-gnu作为gcc -m32包含路径的一部分。也许以后Ubuntu的配置有所不同,但是我的Arch系统是最新的。
在制作配方中添加-I /usr/include/x86_64-linux-gnu似乎已解决了该问题:
1 2
| 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.h,unistd_64.h和unistd_x32.h,以及unistd.h,其中有条件地包括当前模式的正确目录。 (每个内容与usrincludei386-linux-gnu中的内容相同)。 我的系统上的gcc会根据-m32或-m64自动将-I路径设置为包括usrincludei386-linux-gnu或usrincludex86_64-linux-gnu。 因此,它可能会获得其他文件的错误标头,而不是unistd.h。 (在这两个路径下的asm目录之间的diff -ur没有区别。)
-
@PeterCordes Im非常确定OP仅需要安装适当的32位支持文件。 让我再次检查。
-
OSX呢? (我可以提出一个单独的问题,但这是第一个搜索引擎的结果)
您需要安装软件包multilib。