编写完驱动代码后要编写Makefile,并使用make进行编译,这里举一个最经典的驱动模块的Makefile写法
KERN_DIR = /home/me/内核路径
PWD ?= $(shell pwd)
all:
make -C $(KERN_DIR) M=$(PWD) modules
$(CROSS_COMPILE)gcc -o xxx_app xxx_app.c
clean:
make -C $(KERN_DIR) M=$(PWD) modules clean
rm -rf modules.order
rm -f xxx_app
obj-m += xxxx.o
执行 make 之后,会执行Makefile下的 all:后面的命令
- KERN_DIR
该变量指定内核源码的路径,因为编译驱动模块需要进入到对应的内核源码中 - PWD
该变量表示当前驱动源码所在路径 - make -C $(KERN_DIR) M=$(PWD) modules
这句命令表示编译模块
make -C $(KERN_DIR) 中 -C 表示进入某个目录使用其 Makefile 进行编译,这里即进入到内核目录,使用内核目录下的 Makefile 进行编译
M=$(PWD) 中 M=Dir 表示去哪个路径下寻找模块源码,这里即在当前目录下寻找模块源码(个人理解是找 xxxx.c文件) - obj-m += xxxx.o
这句命令表示把 xxxx.c 编译成 xxxx.o ,最终编译成模块 xxxx.ko 文件
PS:-m表示不会编译进内核,但会生成一个 xxxx.ko 文件,如果是 -y 则表示把 xxxx.o 文件编译进内核
- $(CROSS_COMPILE)gcc -o xxx_app xxx_app.c (可有可无,针对应用程序的)
$(CROSS_COMPILE) 指的是当前环境下指定的编译工具链,该命令指的是编译当前目录下的 xxx_app.c 应用程序
在编译内核之前需要指定编译的平台和工具链,如下所示
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabihf-