【发布时间】: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.h的linux-libc-dev(包括unistd_64.h或unistd_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 <asm/unistd.h>在.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