[ZLG-ARM] LINUX 2.6 内核下多C文件模块编译方法

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

这个是很难,但必须理解

  
您需要登录后才可以回帖 登录 | 注册

本版积分规则

139

主题

185

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部