本文介绍了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 heredocumentation 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不能包含相对路径的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-18 16:01