在尝试在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
引用的头文件?
build-essential
?它应该依赖于linux-libc-dev
,其中包含/usr/include/x86_64-linux-gnu/include/asm/unistd.h
(其中包括unistd_64.h
或unistd_32.h
,或 x32,取决于 -m32 是否存在)。可能是 在Ubuntu上编译C代码时遇到问题。(#include错误) 的重复。 - Peter Cordesapt list --installed
的结果中,我看到了以下内容:build-essential/xenial,now 12.1ubuntu2 amd64 [installed]
。 - dharmatech-I /usr/include/x86_64-linux-gnu
。这似乎解决了问题!谢谢! - dharmatech#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