我正在尝试学习如何在linux上编写设备驱动程序。我看过几个在线教程。它们很简单但我编译时遇到问题。我在底部遇到了makefile错误。我没有对linux-header-2.6.32-27-generic做任何事情。它处于安装状态。它可能有一些依赖,但我没有想法。我不确定是什么让人期待。 我将不胜感激任何帮助。
Linux rat-desktop 2.6.32-27-generic#49-Ubuntu SMP Wed Dec 1 23:52:12 UTC 2010 i686 GNU / Linux
包含文件位于/usr/src/linux-headers-2.6.32-27-generic
rat@rat-desktop:/usr/src/linux-headers-2.6.32-27-generic$ ls
arch firmware Kbuild modules.order security usr
block fs kernel Module.symvers sound virt
crypto include lib net source
Documentation init Makefile samples tools
drivers ipc mm scripts ubuntu
nothing.c
#include <linux/init.h>
#include <linux/module.h>
MODULE_LICENSE("Dual BSD/GPL");
static int __init hello_init(void)
{
printk(KERN_ALERT "Hello,world tapas\n");
return 0;
}
static void __exit hello_exit(void)
{
printk(KERN_ALERT "Good Bye,cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);
Makefile
obj-m := nothing.o
KDIR = /usr/src/linux-headers-2.6.32-27-generic
all:
$(MAKE) make -C $(KDIR) M=pwd modules
clean:
rm -rf *.o *.ko *.mo.* *.symvers *.order
sudo make
make make -C /usr/src/linux-headers-2.6.32-27-generic M=pwd modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
make[1]: *** No rule to make target `make'. Stop.
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
make: *** [all] Error 2
我使用了另一个Makefile,它让我有了更多细节
obj-m += nothing.o
all:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
rat@rat-desktop:~/deviceDrivers$ sudo make
make -C /lib/modules/2.6.32-27-generic/build M= modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.32-27-generic'
CHK include/linux/version.h
CHK include/linux/utsrelease.h
SYMLINK include/asm -> include/asm-x86
make[2]: *** No rule to make target `kernel/bounds.c', needed by `kernel/bounds.s'. Stop.
make[1]: *** [prepare0] Error 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.32-27-generic'
make: *** [all] Error 2
答案 0 :(得分:1)
在第一个Makefile中,观察运行make
时输出中正在执行的sudo make
命令(通常不需要sudo来构建模块):
make make -C /usr/src/linux-headers-2.6.32-27-generic M=pwd modules
在这种情况下,make
正在搜索名为&#39; make&#39;!的目标。从Makefile中删除$(MAKE)
并尝试。而M=pwd
选项也不正确!
在第二种情况下,PWD
变量未定义。您可以在Makefile中定义它,如下所示:
PWD := $(shell pwd)