Linux makefile示例
嗨,我是linux的新手,我正在通过一个例子http://www.linuxforu.com/2010/12/writing-your-first-linux-driver/我正在使用Ubuntu 12.04并创建了c代码文件名为ofd.c(见下文),保存在我在〜/ Development / MyProgs / myHelloWorldLinuxModule / v2创建的目录中。 我还创建了一个Makefile(见下文),它位于同一目录中。
当我输入make时,我希望在同一目录中看到生成的.ko文件,但我得到的是一条消息“默认情况下无法完成”
我真的不懂makefile
我应该在某个地方定义KERNELRELEASE,
默认情况下实际执行的是什么行,这是否意味着在内核目录和工作目录上执行make,或者我应该将我的代码特别放在某处。
没有usr/src/linux but a /usr/src/linux-headers-3.8.0-29
,所以我改变了这个,这是正确的。 (虽然似乎没有任何区别)。
任何帮助将不胜感激。
码:
/* ofd.c – Our First Driver code */ #include #include #include static int __init ofd_init(void) /* Constructor */ { printk(KERN_INFO "Namaskar: ofd registered"); return 0; } static void __exit ofd_exit(void) /* Destructor */ { printk(KERN_INFO "Alvida: ofd unregistered"); } module_init(ofd_init); module_exit(ofd_exit); MODULE_LICENSE("GPL"); MODULE_AUTHOR("Anil Kumar Pugalia "); MODULE_DESCRIPTION("Our First Driver");`
Makefile中……
# Makefile – makefile of our first driver # if KERNELRELEASE is defined, we've been invoked from the # kernel build system and can use its language. ifneq (${KERNELRELEASE},) obj-m := ofd.o # Otherwise we were called directly from the command line. # Invoke the kernel build system. else KERNEL_SOURCE := /usr/src/linux PWD := $(shell pwd) default: ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules clean: ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} clean endif
错误是由于naming convention your makefile is not able to find source code
首先通过键入uname -a
检查正在运行的内核
然后转到cd /usr/src/
然后检查你的linux源代码名称
例如
uname -a Linux vinay-VirtualBox 3.2.0-50-generic-pae #76-Ubuntu SMP Tue Jul 9 19:24:55 UTC 2013 i686 i686 i386 GNU/Linux
这里的源代码名称是linux-headers-3.2.0-50-generic-pae
所以在你的Makefile中你需要给出这样的正确名称
KERNEL_SOURCE := /usr/src/linux-headers-3.2.0-50-generic-pae
要避免上述问题,请尝试使用此Makefile
# If KERNELRELEASE is defined, we've been invoked from the # kernel build system and can use its language. ifneq ($(KERNELRELEASE),) obj-m := ofd.o # Otherwise we were called directly from the command # line; invoke the kernel build system. else KERNELDIR ?= /lib/modules/$(shell uname -r)/build PWD := $(shell pwd) default: $(MAKE) -C $(KERNELDIR) M=$(PWD) modules endif
这里uname -a解决了这个问题
您的Makefile中有错误。
您必须在定义要对目标执行的操作的行上使用制表符,例如行:
default: ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules
该行必须有一个从行首到${MAKE}
的制表符。 您需要在那里强制使用制表符,否则会出现您目击的错误。
Make语法非常特别关于此要求,并且它很容易出错。 如果您使用像vim这样的编辑器,它通常会以红色突出显示用户的空格字符,以便他们可以理解那里存在错误。
您没有显示运行的make命令以获取此错误。 但是,这样的错误通常意味着您的目录中有一个名为default
的文件或子目录。 Make想要构建目标,makefile中的第一个目标是default
目标。 它没有定义的先决条件,这意味着如果它存在,make假定它是最新的,并且不需要做任何事情来构建它(它存在,并且它不依赖于其他任何东西)。
你应该使用这个:
.PHONY: default clean
宣布default
和clean
目标是“假的”; 这告诉make即使这些目标已经存在,它仍然应该始终运行与它们相关联的配方。
出现错误的原因是,在Makefile中为头文件或内核源代码指定的路径,标签KERNEL_SOURCE无法找到您已经提到过的标题。 而不是改变路径,/ usr / src / linux-headers = 3.8.0-29到/ usr / src / linux。
将Makefile中给出的路径更改为您拥有源代码的内核的实际版本,或者如果您运行的是同一个内核,则可以通过uname
命令获取版本。
更好的方法可能是:
default: $(MAKE) -C /usr/src/$(shell uname -r)/ M=$(shell pwd) modules