一般的在编写内核驱动的时候可以使用一个通用的Makefile,免去了自己编写的麻烦,下面附上我自己用的一个文件:
module - objs := 这个后面是一个通用的.o文件合集,有多少个.c文件,就要有多少个对应的.o文件,比如:
有file1.c和file2.c
那么,就要如下写法:
module - objs := file1 . o file2.o
最后这个module-objs中的module要用obj-m中的.o文件的名字代替。
hello - objs := hello . o
obj - m := hello . o
如果是 module - objs := file1 . o file2.o中有多文件,后面的 obj - m := hello . o中的.o文件不要跟module-objs里面的重名。
最后看一个例子,有两个.c文件,hello.c和hello1.c,如下:
最后就是makefile:
ifneq ($(KERNELRELEASE) , )
# call from kernel build system
my_hello - objs := hello . o hello1 . o
obj - m := my_hello . o
else
KERNELDIR ?= / lib / modules / $(shell uname - r) / build
PWD := $(shell pwd)
modules :
$(MAKE) - C $(KERNELDIR) M = $(PWD) modules
endif
clean :
rm - rf *. o *~ core . depend .*. cmd *. ko *. mod . c . tmp_versions
那么最后生成的内核模块就是 my_hello.ko,就可以加载和卸载了
还有一点就是上面的makefile 不要从上面直接复制,要手动按照上面编写。
ifneq ($(KERNELRELEASE)
,
)
# call from kernel build system
module - objs := hello . o
obj - m := hello . o
else
KERNELDIR ?= / lib / modules / $(shell uname - r) / build
PWD := $(shell pwd)
modules :
$(MAKE) - C $(KERNELDIR) M = $(PWD) modules
endif
clean :
rm - rf *. o *~ core . depend .*. cmd *. ko *. mod . c . tmp_versions
# call from kernel build system
module - objs := hello . o
obj - m := hello . o
else
KERNELDIR ?= / lib / modules / $(shell uname - r) / build
PWD := $(shell pwd)
modules :
$(MAKE) - C $(KERNELDIR) M = $(PWD) modules
endif
clean :
rm - rf *. o *~ core . depend .*. cmd *. ko *. mod . c . tmp_versions
module - objs := 这个后面是一个通用的.o文件合集,有多少个.c文件,就要有多少个对应的.o文件,比如:
有file1.c和file2.c
那么,就要如下写法:
module - objs := file1 . o file2.o
最后这个module-objs中的module要用obj-m中的.o文件的名字代替。
hello - objs := hello . o
obj - m := hello . o
如果是 module - objs := file1 . o file2.o中有多文件,后面的 obj - m := hello . o中的.o文件不要跟module-objs里面的重名。
最后看一个例子,有两个.c文件,hello.c和hello1.c,如下:
/*
======================================================================
A simple kernel module: "hello world"
====================================================================== */
/*
*hello.c
*/
#include < linux / init.h >
#include < linux / module.h >
MODULE_LICENSE( " GPL " );
static int hello_init( void )
{
printk(KERN_ALERT " Hello World in,ztz0223 " );
return 0 ;
}
module_init(hello_init);
MODULE_AUTHOR( " ztz0223 " );
MODULE_DESCRIPTION( " A simple Hello World Module " );
MODULE_ALIAS( " a simplest module " );
A simple kernel module: "hello world"
====================================================================== */
/*
*hello.c
*/
#include < linux / init.h >
#include < linux / module.h >
MODULE_LICENSE( " GPL " );
static int hello_init( void )
{
printk(KERN_ALERT " Hello World in,ztz0223 " );
return 0 ;
}
module_init(hello_init);
MODULE_AUTHOR( " ztz0223 " );
MODULE_DESCRIPTION( " A simple Hello World Module " );
MODULE_ALIAS( " a simplest module " );
//
hello1.c
#include < linux / init.h >
#include < linux / module.h >
static void hello_exit( void )
{
printk(KERN_ALERT " Hello World quit, ztz0223! " );
}
module_exit(hello_exit);
#include < linux / init.h >
#include < linux / module.h >
static void hello_exit( void )
{
printk(KERN_ALERT " Hello World quit, ztz0223! " );
}
module_exit(hello_exit);
最后就是makefile:
ifneq ($(KERNELRELEASE) , )
# call from kernel build system
my_hello - objs := hello . o hello1 . o
obj - m := my_hello . o
else
KERNELDIR ?= / lib / modules / $(shell uname - r) / build
PWD := $(shell pwd)
modules :
$(MAKE) - C $(KERNELDIR) M = $(PWD) modules
endif
clean :
rm - rf *. o *~ core . depend .*. cmd *. ko *. mod . c . tmp_versions
那么最后生成的内核模块就是 my_hello.ko,就可以加载和卸载了
还有一点就是上面的makefile 不要从上面直接复制,要手动按照上面编写。