2013-10-07 107 views
1

您好我是新手到Linux和我通过一个例子 http://www.linuxforu.com/2010/12/writing-your-first-linux-driver/ 我使用Ubuntu 12.04和创建了一个叫做ofd.c C代码文件工作我的方式(见下文),并保存在一个我在〜/ Development/MyProgs/myHelloWorldLinuxModule/v2创建的目录。我也创建了一个Makefile(参见下面),它位于同一个目录中。
我希望看到当我输入做出相同的目录下生成一个.ko文件,但我得到的是一个消息,说“为默认将做什么”Linux的makefile文件例子

我真的不明白makefile文件

我应该定义KERNELRELEASE地方,

什么是默认的行实际上这样做,这是否意味着开展做出内核目录和工作目录或者我应该把我的代码的地方尤其如此。

有没有usr/src/linux but a /usr/src/linux-headers-3.8.0-29,所以我改变了这一点,是正确的。 (虽然似乎没有任何区别,但)。

任何帮助将不胜感激。

代码:

/* ofd.c – Our First Driver code */ 
#include <linux/module.h> 
#include <linux/version.h> 
#include <linux/kernel.h> 

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 <email_at_sarika-pugs_dot_com>"); 
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 

回答

0

您的Makefile中的错误。

必须在定义针对目标的动作的行上使用制表符,例如,行:

default: 
    ${MAKE} -C ${KERNEL_SOURCE} SUBDIRS=${PWD} modules 

线必须具有从线到${MAKE}的开始的标签。您需要强制使用制表符,否则您目击的错误将会发生。

Make语法对此要求非常特别,它很容易出错。如果您使用了像vim这样的编辑器,它通常会向红色突出显示的用户显示空格字符,以便他们能够理解错误出现在那里。

0

您没有显示您运行得到此错误的make命令。但是,这样的错误通常意味着您的目录中有一个名为default的文件或子目录。 Make想要构建目标,并且makefile中的第一个目标是default。它没有定义的先决条件,这意味着如果它存在,则认为它是最新的,并且不需要做任何事情来构建它(它存在,并且不依赖于其他任何东西)。

你应该使用这样的:

.PHONY: default clean 

申报defaultclean目标是 “假的”;这表明即使这些目标已经存在,它仍然应该始终运行与它们相关的配方。

1

的错误是由于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 u需要给予正确的名称是这样

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做出决议问题

0

错误是由于原因,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