多个*.c文件编译生成一个模块驱动*.ko的makefile文件编写
2015-10-05 15:53
477 查看
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
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
相关文章推荐
- 20151005模拟赛总结
- Bootstrap 导航栏和登陆框
- ALLEGRO同时旋转多元件
- 从网络缓存图片到本地
- 编程思想之多线程与多进程——以操作系统的角度述说线程与进程
- Hibernate不能自动建表解决办法
- 在屏幕上输出以下图案
- Android性能专项测试之MAT
- mysql 卸载-安装-主从集群
- 冒泡排序算法(Java)
- [一个经典的多线程同步问题]解决方案四:信号量
- 关于 微软必应词典客户端 的案例分析
- Linux平台下编写的即时通讯软件(聊天室)和通讯录
- Linux的uio机制架构详解(三)
- 区别:并发与并行
- [LeetCode][JavaScript]Set Matrix Zeroes
- nginx动静分离后的一些小事故,给出处理方法
- 监听ListView列表项点击和滚动事件
- 用C编写的诙谐幽默的关机程序。
- Java:对象的强、软、弱和虚引用