设备驱动程序Hello world的make文件出错

时间:2015-02-05 20:54:19

标签: c linux linux-kernel makefile linux-device-driver

我有一个带有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

提前致谢......

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

,请按如下方式创建Makefile
obj-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 '命令首先将其目录更改为随选项提供的目录,即 / lib / modules / $(shell uname -r)/ build 这是你的内核源目录和M =选项导致makefile移回你的模块源目录,因为 CURDIR 当前目录)总是设置为当前的工作目录。

如果仍然无效,请回复。如果您是此领域的初学者,This pdf可以帮助您作为快速参考。如果您希望将来成为linux设备驱动程序编程的专家,请关注This Book。值得一读。