背景:
最近在DTU项目中遇到一个两个模块整合的问题,也就是把原来的E1模块和SPT模块整合在一起,但是就是这个问题阻止了项目前进的步伐,耽误整整2个工作日的时间,具体原因还是在LINUX的下模块的开发方法不是很熟悉,很多的东西处于摸索状态,因此即使是一个不起眼的问题,也会造成很大的麻烦。
问题描述:
在LINUX 2.6.10的内核下如何编译多个C源文件,问题的实质就是:主C文件里函数如何调用其他的函数或者变量,当然也可以相互调用。
解决方法:
对于模块中的常用格式还是跟单模块是一致的,函数和变量的使用方法跟正常的应用程序C多文件相互调用没有什么不同,这里关键是Makefile的书写方法是最重要,下面就拿一个例子给大家讲解一下,例子的代码同本文档一起压缩在压缩包内。
Makefile文件关键代码:
MODULE_NAME :=test
RESMAN_CORE_OBJS :=hello1.o
RESMAN_GLUE_OBJS :=hello2.o
$(MODULE_NAME)-objs := $(RESMAN_CORE_OBJS) $(RESMAN_GLUE_OBJS)
obj-m :=test.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
$(MAKE) -C $(KERNELDIR) M=$(PWD)
WARNING::红色的为重要的部分,蓝色的是不能修改的部分,否则不是编译出文件就是编译出的模块不能用,
MODULE_NAME :该变量指定最终生成的.KO文件的名字,也就是模块的名字。
RESMAN_CORE_OBJS:这个变量指定含有入口函数也就是函数module_init()函数和module_exit()函数的主文件,类似应用程序里面的MAIN.C,
RESMAN_GLUE_OBJS :该变量指定主文件调用的在其他C文件里面实现的函数的C文件对应的.O文件。
obj-m :指定最终生成模块的名字对应的.O文件,不要漏掉.O否者会有如下错误
make -C /lib/modules/2.6.9-11.EL/build M=/opt/modules
make[1]: Entering directory `/usr/src/kernels/2.6.9-11.EL-i686'
scripts/Makefile.build:194: 目标“/opt/modules/test”不匹配目标模式
LD /opt/modules/built-in.o
CC [M] /opt/modules/test
gcc: no input files
make[2]: *** [/opt/modules/test] 错误 1
make[1]: *** [_module_/opt/modules] 错误 2
make[1]: Leaving directory `/usr/src/kernels/2.6.9-11.EL-i686'
make: *** [all] 错误 2
外部函数和变量的使用方法:
函数可以声明也可以不声明,但最好是声明,因为这样逻辑层次关系明显,也方便阅读代码,外部的变量必须声明,否者会提示找不到变量的错误,用extern来声明。
|