C 设备驱动程序Hello world的生成文件出错

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文件的设备驱动程序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 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
制作
d
CURDIR
是一个GNU扩展(这是可以的,因为内核
Makefile
s无论如何都是GNU),它总是保证设置。在这里使用PWD不会产生任何问题,因为我以前已经创建了自己的设备驱动程序
insmod
ing with
sudo
安装模块时,每次都没有出现任何故障。但是,你的建议很合理。所以,我正在编辑我的答案。谢谢你,苏拉杰特巴拉蒂,当然可以。我说的不是
insmod
,而是在内核中与其他模块一起安装模块,并以内核的makefile为
modules\u install
目标。为什么不定义PWD?不需要定义PWD。它总是自动定义为环境变量。此“make”命令首先将其目录更改为与-C选项(即内核源目录)一起提供的目录,而M=选项将使该makefile移回您的模块源目录,该目录始终由PWD自动定义。您可以通过在终端上抛出PWD命令来检查PWD的值。请不要使用
PWD
,而是使用
CURDIR
PWD
是一个环境变量,不能传递给
sudo
。因此,如果您想安装模块,这将成为一个问题。事实上,由于OP有“M=”而没有参数,他甚至可能使用了
PWD
从internet复制,并使用
sudo
制作
d
CURDIR
是一个GNU扩展(这是可以的,因为内核
Makefile
s无论如何都是GNU),它总是保证设置。在这里使用PWD不会产生任何问题,因为我以前已经创建了自己的设备驱动程序
insmod
ing with
sudo
安装模块时,每次都没有出现任何故障。但是,你的建议很合理。所以,我正在编辑我的答案。谢谢你。@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)