一個或多個C文件編譯KO


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

文檔組織結構

image-20220408174534491

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方式:

image-20220408181430917

使用obj-y方式:

image-20220408181846161


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM