我有一个带有make file的设备驱动程序hello world的简单代码。在12.04 LTS的情况下执行得很好但是最近我将ubuntu升级到14.04之后,相同的程序无法编译。
上有错误消息make
make -C /lib/modules/3.13.0-45-generic/build M= modules
make[1]: Entering directory `/usr/src/linux-headers-3.13.0-45-generic'
make[2]: *** No rule to make target `/usr/src/linux-headers-3.13.0-45-generic/arch/x86/syscalls/syscall_32.tbl', needed by `arch/x86/syscalls/../include/generated/uapi/asm/unistd_32.h'. Stop.
make[1]: *** [archheaders] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-3.13.0-45-generic'
make: *** [all] Error 2
提前致谢......
答案 0 :(得分:5)
你的make文件不能用于其他版本的内核,因为内核库模块将在/ lib / modules / kernelversion / build中。
所以你应该使用 make -C / lib / modules /“应该是当前运行的内核”/ build
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
使用“shell uname -r”自动加载当前运行的内核版本。
示例makefile
KERNELDIR := /lib/modules/$(shell uname -r)/build
CLEANFILE := *.dis *.o *.ko *.mod.* *.symvers *.*.old
obj-m := hello.o
default:
make -C $(KERNELDIR) M=$(CURDIR) modules
clean:
rm -f $(CLEANFILE)
答案 1 :(得分:1)
您需要在问题中发布Makefile的内容。
无论如何,我认为,Makefile中存在一些问题。您应该编写3.13.0-45-generic
而不是将内核版本指定为$(shell uname -r)
,以便它可以动态获取当前运行的内核版本。通过升级ubuntu,您的内核版本发生了变化。所以,它不再起作用了。
如果您的设备驱动程序文件名为 hello.c
,请按如下方式创建Makefileobj-m += hello.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(CURDIR) clean
执行' make '命令首先将其目录更改为随
如果仍然无效,请回复。如果您是此领域的初学者,This pdf可以帮助您作为快速参考。如果您希望将来成为linux设备驱动程序编程的专家,请关注This Book。值得一读。