当前位置: 技术问答>linux和unix
模块编译的小问题,对makefile的理解
来源: 互联网 发布时间:2016-09-09
本文导语: 照着书上写了一个简单的驱动globalmem,源程序文件是globalmem.c。 makefile文件只写了 obj-m:=globalmem.o 在命令行使用make -C /linux源码目录 M=/驱动代码目录 modules 这样编译出了一个globalmem.ko 在这里,我并不用在makefile文...
照着书上写了一个简单的驱动globalmem,源程序文件是globalmem.c。
makefile文件只写了 obj-m:=globalmem.o
在命令行使用make -C /linux源码目录 M=/驱动代码目录 modules
这样编译出了一个globalmem.ko
在这里,我并不用在makefile文件里面说明要用什么编译器,由于默认为gcc,对吧。
接下来,我想这个在我的arm开发板上面实验这个驱动。照我的想法,应该指定所用的编译工具吧,如写上CC=/路径/arm-linux-gcc什么的。
但是不用这样做,只是在make命令的-C后面指定我开发板用的linux内核目录,编译出来的ko就可以在开发板上使用了。
为什么会这样呢?make这里会根据内核自动的选择使用什么编译器吗?就算是这样,我的交叉编译工具所在的路径我并没有加入环境变量,它是怎么使用的呢?
makefile文件只写了 obj-m:=globalmem.o
在命令行使用make -C /linux源码目录 M=/驱动代码目录 modules
这样编译出了一个globalmem.ko
在这里,我并不用在makefile文件里面说明要用什么编译器,由于默认为gcc,对吧。
接下来,我想这个在我的arm开发板上面实验这个驱动。照我的想法,应该指定所用的编译工具吧,如写上CC=/路径/arm-linux-gcc什么的。
但是不用这样做,只是在make命令的-C后面指定我开发板用的linux内核目录,编译出来的ko就可以在开发板上使用了。
为什么会这样呢?make这里会根据内核自动的选择使用什么编译器吗?就算是这样,我的交叉编译工具所在的路径我并没有加入环境变量,它是怎么使用的呢?
|
在命令行使用make -C /linux源码目录 M=/驱动代码目录 modules
=================================
这个是关键。你要看的是 linux 源码目录 下的 Makefile, 这里已经定义好了工具链和平台等等。
=================================
这个是关键。你要看的是 linux 源码目录 下的 Makefile, 这里已经定义好了工具链和平台等等。
|
是
无法编译
|
关键 make -C 就是指定了使用内核的 Makefile
-M 参数告诉内核你要编译代码的位置,它会在它的 Makefile 中包含你的 Makefile。
所以你的 Makefile 只是整个内核复杂 Makefile 树中的一个。
-M 参数告诉内核你要编译代码的位置,它会在它的 Makefile 中包含你的 Makefile。
所以你的 Makefile 只是整个内核复杂 Makefile 树中的一个。