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的使用
- 解析Linux的MakeFile
- Makefile的解析
- 解析Makefile --- 简单的Makefile示例
- vivi的Makefile文件解析
- 一个makefile文件的解析
- vivi的Makefile文件解析
- Makefile的通用模板解析
- Makefile的详细解析<一>
- makefile解析
- Makefile解析
- vivi的Makefile文件解析(1)
- vivi的Makefile文件解析(2)
- vivi的Makefile文件解析(3)
- vivi的Makefile文件解析(4)
- vivi的Makefile文件解析(2)
- vivi的Makefile文件解析(3)
- vivi的Makefile文件解析(4)
- vivi的Makefile文件解析(2)
- web项目开发 之 前端规范 --- JavaScript编码规范
- OpenCV 图像力矩
- iOS开发------使用自定义.bundle中的资源文件
- C#中用到的oracle语句总结
- fprintf调试输出
- Makefile的解析
- js中typeof的应用
- 游戏服务器心跳包的作用
- js获取form表单所有数据
- java基础 - 多线程定时器定时任务
- redis使用内存方式
- Content Provider Basics
- 2016 上架流程
- 题目273 字母小游戏