编译内核模块时添加-I参数仍无法搜索到include目录头文件
问题根因
你编译内核模块时用的make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules命令,会先把工作目录切换到-C指定的内核构建目录下。你写的-Iinclude是相对路径,GCC会去内核构建目录下找include子文件夹,根本不会扫描你当前项目里的include目录,自然报找不到头文件的错误。
排查方法
- 临时在
EXTRA_CFLAGS里加-v参数,编译时查看GCC输出的头文件搜索路径列表(对应#include <...> search starts here:段落),就能确认你写的-Iinclude实际指向的是内核目录下的路径,根本没包含你项目的头文件目录。 - 也可以临时把
-Iinclude换成你项目include目录的绝对路径测试,如果替换后编译通过,就能确定是相对路径解析错位导致的问题。
修复方案
内核构建系统预定义了$(src)变量,专门指向你传入的M=参数对应的模块源码根目录,把EXTRA_CFLAGS里的头文件路径改成用这个变量拼接的绝对路径即可,修改后的配置如下:
EXTRA_CFLAGS += -I$(src)/include -Werror -Wall \ -Wno-missing-braces -Wno-error=unused-function all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules clean: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
注意:写内核模块Makefile时,所有指向项目内文件的路径都不要直接用裸相对路径,优先用
$(src)拼接,避免因为make切换工作目录导致路径失效。
内容的提问来源于stack exchange,提问作者nigihen Shoam
相关产品推荐
相关产品推荐

