我正在使用 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
所以我有这个头文件,但为什么不能找到它呢? 为什么它不起作用?
我正在使用 Gentoo,并尝试编译一个控制并口位的程序。它在顶部有这样一行代码:
#include <asm/io.h>
我不确定您是否是该程序的作者,还是只是尝试编译从他人处获得的程序,但是看起来应将#include <asm/io.h>
替换为#include <sys/io.h>
。有关更多信息,请参见此 Google 搜索结果。
/usr/include/asm
中的代码/头文件,而应改用/usr/include/sys
中的头文件。如果使用/usr/include/asm/
,则正在针对内核头文件的特定版本构建代码。这可能导致在内核头文件更改时出现故障。通过链接到其他位置,您将链接到glibc中更稳定的头文件形式,该头文件将根据需要引用内核头文件。这就是为什么头文件中到处都有大量的#ifdef...#endif
行的原因。相信我,您需要操作并行端口的所有工具都将在 /usr/include/sys/io.h
中,因为您可能会使用直接的readb()
和 writeb()
调用来访问适当的/dev/lpX
设备。尝试
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/io.h
替换为 sys/io.h
。http://homebrewtechnology.blogspot.com/2009/03/internet-controled-car-v2-parallel-port.html 看起来表明它可以工作。 - Alok SinghalMakefile
文件来解决了这个问题: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
你可能需要添加路径。在gcc命令行上:
gcc -I/usr/src/linux-2.6.32-gentoo/arch/x86/include ...