本文介绍了Linux内核模块Makefile不能包含相对路径的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我正在尝试构建Linux内核模块:
KBUILD_EXTRA_SYMBOLS := ../../Module.symvers
KBUILD_EXTRA_SYMBOLS := ../../dir0/Module.symvers
KDIR = ../../../../kernel/linux-4.9
INCLUDES =
-I../dir1/dir2/dir3
-I../dir1/dir2
-I../dir1
EXTRA_CFLAGS += $(INCLUDES)
PWD = $(shell pwd)
TARGET = some_module
obj-m := $(TARGET).o
all: default clean
default:
make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
disclean: clean
@rm -f *.ko
但无法在相对路径中找到文件,例如fatal error: some_header.h: No such file or directory
。当我使用绝对路径,它工作得很好,但我需要做相对寻址从当前的目录在这个项目。怎么了?
如果很明显,很抱歉。
linux
推荐答案内核使用KBuild创建模块。该框架不同于常规的Makefile约定,因此虽然GNU make对它们都进行了解释,但需要注意其中的差异。Documentation for Makefiles using Kbuild can be found here和documentation for building external kernel modules can be found here。
下面引用了文档中与您的问题相关的几个要点。
发件人makefiles.txt
:
发件人modules.txt
:
因此,您的Makefile应该如下所示:
KBUILD_EXTRA_SYMBOLS := $(src)/../../Module.symvers
KBUILD_EXTRA_SYMBOLS := $(src)/../../dir0/Module.symvers
KDIR = $(src)/../../../../kernel/linux-4.9
INCLUDES =
-I$(src)/../dir1/dir2/dir3
-I$(src)/../dir1/dir2
-I$(src)/../dir1
EXTRA_CFLAGS += $(INCLUDES)
PWD = $(shell pwd)
TARGET = some_module
obj-m := $(TARGET).o
all: default clean
default:
make $(INCLUDES) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
disclean: clean
@rm -f *.ko
这篇关于Linux内核模块Makefile不能包含相对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!