我应该如何为 linux 内核模块构建设置额外的包含路径?

Posted

技术标签:

【中文标题】我应该如何为 linux 内核模块构建设置额外的包含路径?【英文标题】:How should I set extra include path for linux kernel module build? 【发布时间】:2021-09-28 12:18:16 【问题描述】:

这是我用于交叉构建内核模块的 Makefile。

export CROSS_COMPILE:=aarch64-none-linux-gnu-
export ARCH:=arm64
obj-m += chr_drv_ex1.o
export KDIR:=linux-source-5.4.0
#EXTRA_CFLAGS=-I../../qemu-5.1.0/hw/misc
#ccflags-y=-I../../qemu-5.1.0/hw/misc

all: test_chr_drv map_hugetlb test_ioctl_drv
    make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) modules

clean:
    make ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) -C $(KDIR) M=$(PWD) clean
    rm -f test_chr_drv map_hugetlb test_ioctl_drv

%: %.c
    $(CROSS_COMPILE)gcc $^ -o $@

现在在我的 chr_drv_ex1.c 文件中,我想在 ../../qemu-5.1.0/hw/misc 目录中包含一个头文件。添加此路径的正确方法是什么?我看到this 并尝试设置 EXTRA_CFLAGS 和 ccflags-y 但它们都不起作用(这些都在上面注释掉了)。当然,如果我在 chr_drv_ex1.c 源代码中使用#include "../../qemu-5.1.0/hw/misc/axpu_regs.h",我可以编译它。但我想用#include <axpu_regs.h>

【问题讨论】:

天哪,为了实现你想要的,第 3 行和cflags-y 可能的行就足够了。 这能回答你的问题吗? Linux kernel module Makefile can't include relative paths 【参考方案1】:

我把 ccflags-y 改成

ccflags-y := -I../../qemu-5.1.0/hw/misc

ccflags-y := -I../../../qemu-5.1.0/hw/misc

因此,应该从内核 make 目录(Linux 内核的 Makefile 所在的位置。在本例中为 linux-source-5.4.0 目录,它比我现在所在的位置低一级)指定包含路径。

【讨论】:

了解$(src)$(srctree)(第二个名字我记不太清了,用git grep ...找例子。

以上是关于我应该如何为 linux 内核模块构建设置额外的包含路径?的主要内容,如果未能解决你的问题,请参考以下文章

应该如何为 laravel 4 composer 包设置 git 子模块?

如何为 React 设置 Sublime Text 3?

如何为多个 Python 版本和平台构建编译模块

如何为树莓派编译内核模块?

如何为内核 5.10.x 模块驱动程序版本替换 set_fs(KERNEL_DS)

如何为 OSX 菜单额外启用复制和粘贴