C 设备驱动程序Hello world的生成文件出错
我有一个简单的代码,带有一个make文件的设备驱动程序helloworld。它在12.04 LTS的情况下执行得很好,但最近我把我的ubuntu升级到了14.04,之后同样的程序无法编译。 打开错误消息C 设备驱动程序Hello world的生成文件出错,c,linux,linux-kernel,makefile,linux-device-driver,C,Linux,Linux Kernel,Makefile,Linux Device Driver,我有一个简单的代码,带有一个make文件的设备驱动程序helloworld。它在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
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
提前感谢……希望您在问题中发布Makefile的内容。 无论如何,我认为,你的Makefile中有一些问题。您不应该将内核版本指定为
3.13.0-45-generic
,而应该编写$(shell uname-r)
,以便动态获取当前运行的内核版本。升级ubuntu后,您的内核版本发生了变化。所以,它不再工作了
如果您的设备驱动程序文件名为hello.c,则按如下方式创建Makefile
“make”命令的执行首先将其目录更改为与-C选项一起提供的目录,即/lib/modules/$(shell uname-r)/build,这是您的内核源目录,M=选项使makefile作为CURDIR(当前目录)移回模块源目录始终设置为当前工作目录
如果仍然不起作用,请回复。如果你是这个领域的初学者,可以帮助你作为一个快速的参考。如果您将来想成为linux设备驱动程序编程方面的专家,请遵循以下步骤。它值得一读。你应该在你的问题中发布你的Makefile的内容。 无论如何,我认为,你的Makefile中有一些问题。您不应该将内核版本指定为
3.13.0-45-generic
,而应该编写$(shell uname-r)
,以便动态获取当前运行的内核版本。升级ubuntu后,您的内核版本发生了变化。所以,它不再工作了
如果您的设备驱动程序文件名为hello.c,则按如下方式创建Makefile
“make”命令的执行首先将其目录更改为与-C选项一起提供的目录,即/lib/modules/$(shell uname-r)/build,这是您的内核源目录,M=选项使makefile作为CURDIR(当前目录)移回模块源目录始终设置为当前工作目录
如果仍然不起作用,请回复。如果你是这个领域的初学者,可以帮助你作为一个快速的参考。如果您将来想成为linux设备驱动程序编程方面的专家,请遵循以下步骤。它值得一读。由于内核库模块位于/lib/modules/kernelversion/build中,因此您的make文件不适用于其他版本的内核 所以你应该使用 make-C/lib/modules/“应该是当前正在运行的内核”/build 它将使用“shell uname-r”自动加载当前运行的内核版本 示例生成文件
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)
由于内核库模块位于/lib/modules/kernelversion/build中,因此make文件不适用于内核的其他版本 所以你应该使用 make-C/lib/modules/“应该是当前正在运行的内核”/build 它将使用“shell uname-r”自动加载当前运行的内核版本 示例生成文件
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)
你为什么不定义PWD?你不需要定义PWD。它总是自动定义为环境变量。此“make”命令首先将其目录更改为与-C选项(即内核源目录)一起提供的目录,而M=选项将使该makefile移回您的模块源目录,该目录始终由PWD自动定义。您可以通过在终端上抛出PWD命令来检查PWD的值。请不要使用
PWD
,而是使用CURDIR
PWD
是一个环境变量,不能传递给sudo
。因此,如果您想安装模块,这将成为一个问题。事实上,由于OP有“M=”而没有参数,他甚至可能使用了PWD
从internet复制,并使用sudo
制作dCURDIR
是一个GNU扩展(这是可以的,因为内核Makefile
s无论如何都是GNU),它总是保证设置。在这里使用PWD不会产生任何问题,因为我以前已经创建了自己的设备驱动程序insmod
ing withsudo
安装模块时,每次都没有出现任何故障。但是,你的建议很合理。所以,我正在编辑我的答案。谢谢你,苏拉杰特巴拉蒂,当然可以。我说的不是insmod
,而是在内核中与其他模块一起安装模块,并以内核的makefile为modules\u install
目标。为什么不定义PWD?不需要定义PWD。它总是自动定义为环境变量。此“make”命令首先将其目录更改为与-C选项(即内核源目录)一起提供的目录,而M=选项将使该makefile移回您的模块源目录,该目录始终由PWD自动定义。您可以通过在终端上抛出PWD命令来检查PWD的值。请不要使用PWD
,而是使用CURDIR
PWD
是一个环境变量,不能传递给sudo
。因此,如果您想安装模块,这将成为一个问题。事实上,由于OP有“M=”而没有参数,他甚至可能使用了PWD
从internet复制,并使用sudo
制作dCURDIR
是一个GNU扩展(这是可以的,因为内核Makefile
s无论如何都是GNU),它总是保证设置。在这里使用PWD不会产生任何问题,因为我以前已经创建了自己的设备驱动程序insmod
ing withsudo
安装模块时,每次都没有出现任何故障。但是,你的建议很合理。所以,我正在编辑我的答案。谢谢你。@SurajeetBhara
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)