首先需要知道:

obj-m = *.o

obj-y = *.o

上面两者的区别在于,前者才会生成ko文件,后者只是代码编译进内核,并不生成ko文件。



生成KO文件,分两种情况:单个.c文件和多个.c文件【以展讯7730 ANDROID4.4为例】

1.单个.c文件

kernel配置文件中定义

CONFIG_RUNYEE_CAMVIB=m

注意上面的m,表示作为一个模块进行编译,最后在MAKEFILE中需要用到的编译开关。

然后再相应的源码目录中的MAKEFILE中添加如下语句:

obj-$(CONFIG_RUNYEE_CAMVIB) := camvib.o

上面的一行的作用就是编译camvib.c的源文件,同时会生成相应的camvib.ko文件,和编译生成

的camvib.o在同一目录

最后就是insmod动作了:

insmod /system/lib/modules/camvib.ko



2.多个.c文件生成ko文件

kernel配置文件中定义

CONFIG_TOUCHSCREEN_FOCALTECH=m

注意上面的m,表示作为一个模块进行编译,最后在MAKEFILE中需要用到的编译开关。

然后再相应的源码目录中的MAKEFILE中添加如下语句:

obj-$(CONFIG_TOUCHSCREEN_FOCALTECH)  +=
focaltech_ts.o

focaltech_ts-objs :=
focaltech.o

focaltech_ts-objs +=
focaltech_ctl.o

focaltech_ts-objs +=
focaltech_ex_fun.o

上面的意思就是编译生成ko文件需要三个.c文件【focaltech.c focaltech_ctl.c focaltech_ex_fun.c】,最后

生成名为focaltech_ts的ko文件,注意ko文件名一定不能为focaltech。那么在obj-m和lpc-objs中都含有focaltech.o,

对make来讲会产生循环和混淆,因此也不能这样书写

最后就是insmod动作了:

insmod /system/lib/modules/focaltech_ts.ko

注意事项:

1 源代码书写要保证正确,MODULE_LICENSE();是一条语句,后面要有分号;

2 static void hello_exit()的返回类型为void;

3 make M=`pwd` M参数后面不是单引号,而是斜点``;

4 -c 指定包含kernel顶级Makefile的源码目录;

5 源代码要执行make menuconfig生成默认配置,无须修改任何内容;

6 make menuconfig 的运行可能需要安装necurses-dev;

7 生成ko模块文件所使用的源码版本要和insmod的目标内核版本一致;

8 2.6个版本内核下载 http://www.kernel.org/pub/linux/kernel/v2.6/;

9 make编译可能提示没有modpost等脚本文件,可以从其它源码目录拷到当前使用源码目录下,或者利用当前源码目录下的c文件直接编译生成;

10 如果insmod过程中出错,可以使用dmesg | tail 命令查看系统日志

11 模块的编译和插入,对版本一致性要求很严格,如果编译依赖的内核源码版本和目标平台正在运行的内核版本不一致的话,很可能模块无法正常insert,出现诸如“-1 Invalid module format”或“no symbol version for module layout”的错误

所以编译过程中:

不是为正在运行的内核编译模块:

make -C M='pwd'

为正在运行的内核编译模块:

make -C /lib/modules/'uname -r'/build M='pwd'

即可以保证insmod无误;

举例:

内核源文件my.c

  1. #include <linux/init.h>
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. static int funcIn(void)
  5. {
  6. printk("in module");
  7. return 0;
  8. }
  9. static void funcOut(void)
  10. {
  11. printk("out module");
  12. return;
  13. }
  14. module_init(funcIn);
  15. module_exit(funcOut);
  16. MODULE_LICENSE("GPL");
  17. MODULE_AUTHOR("elfy");

Makefile 文件

  1. obj-m:=my.o
  2. mymodule-objs:=module
  3. KDIR:=/lib/modules/$(shell uname -r)/build
  4. MAKE:=make
  5. default:
  6. $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
  7. clean:
  8. $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) clean

注意事项:

1、内核目录

2、Makefile中obj-m:=my.o 这个和源文件my.c要对应

3、mymodule-objs:=module 这个my也是和my.c对应的

如果源文件为your.c

这两句话就应该改为obj-m:=your.o

yourmodule-objs:=module

4、查看输出的时候 用dmesg输出信息太多,可以用grep过滤一下

dmesg | grep "keywords"

.c文件如何编译为ko的MAKEFILE文件编写的更多相关文章

  1. Configure,Makefile.am, Makefile.in, Makefile文件

    一 软件安装关于 makefile文件问题 如果拿到的工程文件中,没有Makefile文件,而只有configure.in和Makefile.am文件,我们是不能够直接进行编译的,必须根据config ...

  2. Linux下多个.c文件的编译和Makefile文件

    在编程的时候,我们可以把一个完整程序的每个函数分离出来,写成.c文件,最后再一起编译和链接.这样有利于程序功能模块化,也方便检查代码错误. .h文件:里面编辑该程序需要引用的头文件. #ifndef  ...

  3. Linux内核Makefile文件(翻译自内核手册)

    --译自Linux3.9.5 Kernel Makefiles(内核目录documention/kbuild/makefiles.txt) kbuild(kernel build) 内核编译器 Thi ...

  4. 使用automake等命令自动生成Makefile文件 (转载)

    使用automake等命令自动生成Makefile文件   Linux下编程时,为了方便编译,往往使用Makefile文件自动完成编译,但是Makefile文件本身的书写十分复杂,规则很多.好在Lin ...

  5. 实例学习写Makefile文件

    目录 0. 扫盲 1. 编译,链接 2. Makefile文件执行 3. Makefile书写规则 4. 案例 5. Makefile是如何工作的 6. 拔高,参考 0. 扫盲 Linux 环境下的程 ...

  6. Linux平台Makefile文件的编写基础篇(转)

    目的:       基本掌握了 make 的用法,能在Linux系统上编程.环境:       Linux系统,或者有一台Linux服务器,通过终端连接.一句话:有Linux编译环境.准备:      ...

  7. Linux学习之Makefile文件的编写

    转自:http://goodcandle.cnblogs.com/archive/2006/03/30/278702.html 目的:       基本掌握了 make 的用法,能在Linux系统上编 ...

  8. makefile文件写法解析

    一.makefile文件示例 makefile文件并不难写,一个makefile模版如下所示,所有makefile文件在此基上稍微修改就可以了. # this is a makefile #这一行是注 ...

  9. 面试题----makefile文件的作用

    make工具和makefile文件 make工具和makefile文件简介 make命令和makefile文件的结合提供了一个在项目管理领域十分强大的工具.它不仅常被用于控制源代码的编译和链接,而且还 ...

随机推荐

  1. gradle 本地 配置

    distributionUrl=file:///D:/react/gradle-2.4-all.zip 记住差一点都会报错 编译运行Android 我们进入AwesomeProject目录, $ cd ...

  2. 2015GitWebRTC编译实录10

    2015.07.20 rtc_p2p编译通过[879/1600 ] CXX obj /webrtc/p2p/client/rtc_p2p.httpportallocator.o[880/1600 ] ...

  3. 第九课,T语言数组的定义与访问(版本5.0)

    数组的定义与访问 数组是一系列数据的集合,可以存储大量数据,通过数组的下标.key,可以实现对数据的快速访问. 为什么要使用数组呢? 如果您有一个项目列表(例如汽车品牌列表),在单个变量中存储这些品牌 ...

  4. AndroidStudio 中的坑Error:(1, 0) Plugin is too old, please update to a more recent version, or set ANDROID_DAILY_OVERRID

    将 build.gradle 中 的 classpath改为2.0.+ dependencies { classpath 'com.android.tools.build:gradle:2.0.+'然 ...

  5. JSBinding+SharpKit / 更新的原理

    首先,其实不是热更新,而是更新. 热更新意思是不重启游戏,但只要你脚本里有存储数据,就不可能.所以只能叫更新. 但大家都这么说,所以... 先举个具体的例子: 如果是C#:在 Prefab 的 Gam ...

  6. linux网络虚拟化

    图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN http://smilejay.com/2012/08/qemu-kvm-networking-m ...

  7. [solr] - 环境搭建

    这里忽略java安装和tomcat安装,这里使用的是solr-4.10.0 1.到apache下载solr,地址: http://mirrors.hust.edu.cn/apache/lucene/s ...

  8. SpringMVC学习系列(4) 之 数据绑定-1

    在系列(3)中我们介绍了请求是如何映射到一个action上的,下一步当然是如何获取到请求中的数据,这就引出了本篇所要讲的内容—数据绑定. 首先看一下都有哪些绑定数据的注解: 1.@RequestPar ...

  9. Apache + PHP 环境搭建

    环境: Win7 64位 php-5.6.19-Win32-VC11-x64 httpd-2.4.18-win64-VC11 下载地址: php:  http://windows.php.net/do ...

  10. MapReduce单表关联学习~

    首先考虑表的自连接,其次是列的设置,最后是结果的整理. 文件内容: import org.apache.hadoop.conf.Configuration; import org.apache.had ...