Linux设备驱动程序:gnu make 扩展语法

/************************************************************************************

原文地址:http://www.cppblog.com/aaxron/archive/2012/03/16/168055.html

说明:这里的Makefile和应用程序中的稍有不一样,特转载过来。

************************************************************************************/

要点:
在用户空间驱动程序
insmod
modprobe
rmmod


一些宏:
LINUX_VERSION_CODE
整数宏


GNU make 扩展语法
obj - m    += hello.o
KERNELDIR   : =   / usr / src / linux - headers - 2.6 . 32 - 5 - 686
PWD : = $(shell pwd)
.PHONY: test clean all
all:
    $(MAKE)  - C $(KERNELDIR) M = $(PWD) modules
clean:
    rm  - rf  * .o  *~  core .depend . * .cmd  * .ko  * .mod.c .tmp_versionsm  * .order  * .symvers .tmp_versions

test:
    insmod . / hello.ko
    rmmod hello
    dmesg  - c

obj-m
由内核构造系统使用的makefilet符号,用来确定在当前目录中应构造哪些模块.
即m:指定把对象编译为模块

obj-y
指定把对象编译进内核中

如果我们要构造的模块为module.ko,并由file1.c和file2.c则正确的makefile可如下编写:
obj-m :=module.o
module-objs :=file1.o file2.o

为了让上面的makefile可以工作,必须在大的内核构造系统环境中调用它们,所以上述命令首先要改变-C指定的目录,即:
 $(MAKE)  - C $(KERNELDIR)
然后指定M变量目录,即让makefile在构造modules目标之前返回到模块源代码的目录,既当前目录 M=$(PWD),最后modules目标指向obj-m变量中设定的模块.


M不是一个编译选项,而是一个变量,从顶层makefile文件里可以找到它的定义 
文件在
/usr/src/linux-headers-2.6.32-5-common/Makefile

69 ifeq ("$(origin M)", "command line")
70   KBUILD_EXTMOD := $(M)
71 endif


-C 用于指定内核源代码的目录

-M 用于module所在的目录

 

如果一个模块包括了多个.c文件(如 file1.c , file2.c),则应该以如下方式编写Makefile
obj-m := modulename.o
module-objs := file1.o file2.o


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值