"#include <asm/io.h>"导致"error: asm/io.h: No such file or directory"错误。

10

我正在使用 Gentoo,并尝试编译一个控制并口位的程序。它在顶部有这样一行代码:

#include <asm/io.h>

当我尝试在其中使用gcc时,它输出以下内容: port.c:4:20: 错误:asm/io.h:没有那个文件或目录
"locate asm/io.h"会返回(除其他内容外):
/usr/src/linux-2.6.32-gentoo/arch/x86/include/asm/io.h
所以我有这个头文件,但为什么不能找到它呢? 为什么它不起作用?

1
它不在您的默认包含路径中吗? - Earlz
6个回答

13

我不确定您是否是该程序的作者,还是只是尝试编译从他人处获得的程序,但是看起来应将#include <asm/io.h>替换为#include <sys/io.h>。有关更多信息,请参见此 Google 搜索结果


4
不要使用/usr/include/asm中的代码/头文件,而应改用/usr/include/sys中的头文件。如果使用/usr/include/asm/,则正在针对内核头文件的特定版本构建代码。这可能导致在内核头文件更改时出现故障。通过链接到其他位置,您将链接到glibc中更稳定的头文件形式,该头文件将根据需要引用内核头文件。这就是为什么头文件中到处都有大量的#ifdef...#endif行的原因。相信我,您需要操作并行端口的所有工具都将在 /usr/include/sys/io.h中,因为您可能会使用直接的readb()writeb()调用来访问适当的/dev/lpX设备。

1

尝试

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include xyx

其中xyz是您要编译的文件。

这告诉编译器在哪里查找包含文件。 如果您的包含文件位于不同的位置,可以使用多个-I选项,例如:

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include -I/usr/src/some/Dir xyx

谢谢,这解决了那个问题。现在唯一的问题是该文件引入了一堆其他文件,其中一个文件(asm-generic/ioctls.h)在我的硬盘上根本不存在...可悲的是,/usr/include/asm-generic/ioctl.h 是存在的。头文件中可能有错别字吗? - marcusw
看起来像是非常古老的代码,尝试让它在现代Linux内核上工作可能会很麻烦。可以告诉我是哪个库/代码吗? - Alok Singhal
这是来自http://bigasterisk.com/projects/parallel的parcon。虽然该网站上有一个二进制文件,但我不想使用它,因为我想自定义程序以适应我的需求。无论如何,我在/usr/include/asm-generic中添加了一个ioctls.h到ioctl.h的符号链接,并在命令行上加入了-I/usr/src/linux/include开关,现在在io.h中出现了大量关于语法错误和未定义变量的错误。也许符号链接没有指向正确的文件? - marcusw
正如我在答案中所说,尝试将 asm/io.h 替换为 sys/io.h。http://homebrewtechnology.blogspot.com/2009/03/internet-controled-car-v2-parallel-port.html 看起来表明它可以工作。 - Alok Singhal
我不明白所有那些“谢谢”的意思,但回答的分数仍然是0。 - Noich
显示剩余2条评论

0
这个回答可能不适用于您的情况,但我希望它能帮助其他人。
对于我来说,当我尝试制作我的驱动程序时,遇到了同样的问题。最终,我通过修正Makefile文件来解决了这个问题:
obj-m += t.o
KDIR:=/lib/modules/$(shell uname -r)/build
MAKE:=make


t-objs:  main.o base.o

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules  
clean:  
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

obj-m += t.o
KDIR:=/lib/modules/$(shell uname -r)/build
MAKE:=make


t-objs:=  main.o base.o

default:
    $(MAKE) -C $(KDIR) M=$(PWD) modules  
clean:  
    $(MAKE) -C $(KDIR) M=$(PWD) clean 

0

你可能需要添加路径。在gcc命令行上:

gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include ...

0
在编译命令行中添加“-I/usr/src/linux-2.6.32-gentoo/arch/x86/include”。

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