您的位置:首页 > 其它

多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写

2015-10-05 15:53 288 查看
MODULE_NAME := lpc

RESMAN_CORE_OBJS:=lpc.o

RESMAN_GLUE_OBJS:=fm.o idt.o

$(MODULE_NAME)-objs:=$(RESMAN_GLUE_OBJS) $(RESMAN_CORE_OBJS)

obj-m :=lpc.o

#else

PWD  := $(shell pwd)

KVER ?= $(shell uname -r)

#KDIR := /lib/modules/$(KVER)/build

KDIR := /iharm/ihkernel

all:

 $(MAKE) -C $(KDIR) M=$(PWD)

clean:

 rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions

这个Makefile编译三个文件idt.c fm.c lpc.c其中模块初始化代码在lpc.c中,要把三个文件编译成一个lpc.ko文件,结果用这个makefile生成的lpc.ko出现如下错误:module license 'unspecified' taints kernel

原因如下:

我们对多个*.c文件情况做一个说明:如果我们希望创建一个模块的名字叫做lpc,我们有三个*.c文件,分别为lpc.c, dit.c和fm.c。这样是有问题的,因为在Makefile中obj-m := lpc.o,这是指定模块的名称, lpc-objs := lpc.o fm.o idt.o,这里是说lpc模块包括的的obj文件,如果我们在里面不填写lpc.o,那么实际并没有编译lpc.c,而是在CC[M]
idt.o和fm.o,通过LD[M]得到模块lpc.o,如果我们在这里填写了lpc.o,那么在obj-m和lpc-objs中都含有lpc.o,对make来讲会产生循环和混淆,因此也不能这样书写。如果我们由多个C文件来构造一个模块,那么C文件的名字不能和模块名字一样,在这个例子中我们可以将lpc.c改名为lpc_main.c,在Makefile中obj-m := lpc.o,lpc-objs = lpc_main.o dit.o fm.o。或者更改模块名lpc.ko为mlpc.ko

改为如下的makefile就可以了:

MODULE_NAME := mlpc

RESMAN_CORE_OBJS:=lpc.o

RESMAN_GLUE_OBJS:=fm.o idt.o

$(MODULE_NAME)-objs:=$(RESMAN_GLUE_OBJS) $(RESMAN_CORE_OBJS)

obj-m :=mlpc.o

#else

PWD  := $(shell pwd)

KVER ?= $(shell uname -r)

#KDIR := /lib/modules/$(KVER)/build

KDIR := /iharm/ihkernel

all:

 $(MAKE) -C $(KDIR) M=$(PWD)

clean:

 rm -rf .*.cmd *.o *.mod.c *.ko .tmp_versions
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: