Makefile的解析

来源:互联网 发布:苏州网络教育机构 编辑:程序博客网 时间:2024/06/03 17:50

在Linux的驱动开发过程,往往需要我们自己去完成Makefile,但是在Makefile编写过程中会遇到一些问题,有些问题使我们通过编译器或是Vi能够发现原因并且解决的,但是很多时候会出现一些“莫名其妙”的问题,而这些问题很可能就是我们的编程习惯造成的,写下这篇文章的初衷,也是因为自己的编程习惯而造成的错误

我在完成G-sensor的驱动编写完成后,对其进行编译生成.ko文件,我编写的Makefile内容如下:

KVERS = $(shell uname -r)                                                                                            
 obj - m += gsensor.o

build : kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules

clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean

这么简单的Makefile,一看就让人想到了helloworld 的练习驱动的编写吧。看上面的Makefile似乎完全找不出的有什么地方发生了错误,但是在编译过程中会报如下错误:

make -C /lib/modules/3.13.0-92-generic/build M=/home/wangwq/mutian/G-driver modules
make[1]: 正在进入目录 `/usr/src/linux-headers-3.13.0-92-generic'
  Building modules, stage 2.
  MODPOST 0 modules
make[1]:正在离开目录 `/usr/src/linux-headers-3.13.0-92-generic'


之后使用ls查看你会发现只有gsensor.c  Makefile  modules.order  Module.symvers等几个文件,根本没有生成.ko文件

傻眼了吧;这怎么可能发生这样的事情呢?回头查找原因,里里外外都没找到

其实这个错误的原因就出在让人不容易察觉的地方:obj - m += gsensor.o 第三行,没错,就在这里,这里在obj - m这里多了两个空格,就是他们导致的错误,正确的书写应该是:obj-m += gsensor.o


在这里在介绍一下Makefile编写的过程中经常遇到的一些语法知识,对于老司机来讲,这都是些老生常谈的问题,不足为虑了,新手反倒是有点用处,就针对我上术的Makefile拆解一下

KVERS = $(shell uname -r)  KVERS自己随便定义的用来保存shell uname -r的值

shell uname -r会取得当前内核的版本号,还有一个是

shell pwd会取得当前工作路径

obj-m += gsensor.o编译的目标 -m是指该文件要作为模块编译。还有用到的-y则是表示要将你编译的文件得到gsensor.o并且编译进内核,除了m, y以外的obj-x形式的目标都不会被编译。由于既可以编译成模块,也可以编译进内核,更常见的做法是根据.config文件的CONFIG_ 变量来决定文件的编译方式。这里我就不多说了。

CURDIR这里的功能是获取当前路径相当于shell pwd,现在Linux内核4.0以后的预计会全部使用这个宏,而逐渐的代替shell pwd的使用




0 0
原创粉丝点击