參考文檔:.c文件如何編譯為ko的MAKEFILE文件編寫 - young525 - 博客園 (cnblogs.com)
文檔組織結構

header目錄:存放頭文件
source目錄:存放源文件
單個文件編譯KO
在source目錄中存放一個文件為kernel_simulator.c,下面的Makefile會編譯該C文件,然后在source目錄下生成一個kernel_simulator.ko。
KVERS = $(shell uname -r)
# 生成模塊名
MODULE_NAME := kernel_simulator
# 源文件目錄
SRC_PATH := source/
# 作為一個模塊進行編譯
CONFIG_RUNYEE_CAMVIB=m
# Kernel modules
obj-$(CONFIG_RUNYEE_CAMVIB) := $(SRC_PATH)$(MODULE_NAME).o
# 指定模塊的一些編譯選項
EXTRA_CFLAGS=-g -O0
build: kernel_modules
kernel_modules:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) modules
clean:
make -C /lib/modules/$(KVERS)/build M=$(CURDIR) clean
CONFIG_RUNYEE_CAMVIB=m
注意上面的m,表示作為一個模塊進行編譯,最后在Makefile中需要用到的編譯開關。
多個文件編譯
在header目錄存放一個:test_func.h
在source目錄存放兩個文件:test_func.c、kernel_simulator.c
通過以下Makefile可以在當前目錄生成一個ksimulator.ko。
KVERS = $(shell uname -r)
# 生成模塊名
MODULE_NAME := ksimulator
# 源文件目錄
SRC_PATH := source/
# 作為一個模塊進行編譯
CONFIG_TOUCHSCREEN_FOCALTECH=m
# 指定頭文件路徑,和一些編譯選項
EXTRA_CFLAGS += -I$(PWD)/header/
EXTRA_CFLAGS += -Werror
EXTRA_CFLAGS += -g -O0
# Kernel modules
obj-$(CONFIG_TOUCHSCREEN_FOCALTECH) += $(MODULE_NAME).o
$(MODULE_NAME)-objs := $(SRC_PATH)kernel_simulator.o
$(MODULE_NAME)-objs += $(SRC_PATH)test_func.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
CONFIG_TOUCHSCREEN_FOCALTECH=m
注意上面的m,表示作為一個模塊進行編譯,最后在MAKEFILE中需要用到的編譯開關。
然后在相應的源碼目錄中的Makefile中添加如下語句:
$(MODULE_NAME)-objs := $(SRC_PATH)kernel_simulator.o
$(MODULE_NAME)-objs += $(SRC_PATH)test_func.o
上面的意思就是編譯生成ko文件需要兩個.c文件(kernel_simulator.c、test_func.c),最后生成名為ksimulator的ko文件。
注意ko文件名一定不能為kernel_simulator。那么在obj-m和$(MODULE_NAME)-objs中都含有kernel_simulator.o,對make來講會產生循環和混淆,會報如下的錯誤:
make[2]: Circular /home/kernel/Kernel_Simulator/kernel_simulator.o <- /home/kernel/Kernel_Simulator/kernel_simulator.o dependency dropped.
基本知識
obj-m = *.o
obj-y = *.o
上面兩者的區別在於,前者才會生成ko文件,后者只是代碼編譯進內核,並不生成ko文件。
使用obj-m方式:

使用obj-y方式:

