[Linux] 编译模块出现 "./include/linux/kernel.h:6:20: fatal error: stdarg.h: No such file or directory" 错误

本文解决在Ubuntu环境下编译第三方驱动时遇到的'fatalerror:stdarg.h:Nosuchfileordirectory'错误。通过调整Makefile或链接本地目录的方式,成功解决了gcc编译时找不到必要头文件的问题。

问题现象

在ubuntu 编译一个第三方的驱动 .ko 时,遇到 “./include/linux/kernel.h:6:20: fatal error: stdarg.h: No such file or directory” 报错

原因

缺少的头文件gcc需要

Makefile 如下

obj-m := awusb.o
KDIR_1 := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
default:
	$(MAKE) -C $(KDIR_1) SUBDIRS=$(PWD) M=${PWD} modules
clean:
	$(MAKE) -C $(KDIR_1) SUBDIRS=$(PWD) M=${PWD} clean
	rm -rf Module.markers module.order module.sysvers 

解决

两种方法

链接到本地目录

sudo ln -s /usr/lib/gcc/x86_64-linux-gnu/5/include/stdarg.h /lib/modules/4.15.0-91-generic/build/include/stdarg.h

Makefile 修改

Makefile 新增一行

ccflags-y = -Wno-declaration-after-statement -mpopcnt -I/usr/lib/gcc/x86_64-linux-gnu/5/include
<think>好的,我现在需要解决用户在编译Linux内核时遇到的“fatal error: stdarg.h: No such file or directory”问题。首先,我得回忆一下stdarg.h是什么文件。这个头文件属于C标准库,用于处理可变参数函数,比如printf。内核编译需要这个文件的话,可能和工具链有关。 用户提到的是编译内核时出现的错误,所以应该检查编译环境是否安装了正确的开发包。在基于Red Hat的系统里,可能需要安装glibc-devel或者kernel-headers。不过用户之前的问题中引用了Arch Linux的信息,所以可能他们使用的是Arch系统。这时候应该确认是否安装了相应的基础开发工具,比如base-devel组,里面包含了必要的头文件和库。 另外,查看引用[2],里面提到gcc使用-nostdlib选项时可能会缺少标准库,但内核编译通常会有自己的设置,可能不完全依赖系统标准库。不过如果系统缺少了基础的头文件,比如stdarg.h,那可能是开发包没装全。需要建议用户安装这些包,比如在Arch上安装linux-headers或者base-devel。 也有可能是因为交叉编译工具链配置不正确,导致编译器找不到正确的头文件路径。需要检查Makefile中的路径设置,或者确认使用的交叉编译工具是否安装了对应的头文件。 还有一种情况是内核源代码本身的问题,可能某些依赖未正确生成。这时候清理源码并重新配置编译可能会有帮助,比如执行make clean或make mrproper,再重新配置。 需要分步骤建议用户:首先安装必要的开发包,然后检查工具链配置,清理构建目录,最后重新编译。同时,引用相关的参考资料,比如引用[2]中提到的标准库链接问题,说明开发包的重要性;引用[3]中提到的Arch内核更新问题,可能需要安装特定内核模块的开发文件。 还要考虑用户是否在正确的目录下执行编译,或者是否有权限问题,但可能性较低,先集中在开发包和工具链上。最后生成相关问题,帮助用户进一步排查可能的问题。</think>编译Linux内核时出现$ \text{stdarg.h} $头文件缺失错误通常由开发工具链不完整导致,以下是分步解决方案: 1. **安装标准C库开发文件** ```bash # RedHat/CentOS sudo yum install glibc-devel # Debian/Ubuntu sudo apt-get install build-essential libc6-dev # Arch Linux sudo pacman -S base-devel linux-headers ``` 该操作会安装$ \text{stdarg.h} $等基础头文件[^2] 2. **验证头文件路径** ```bash echo | gcc -E -v - ``` 检查输出中是否包含类似路径: $$ \text{/usr/include} $$ $$ \text{/usr/lib/gcc/x86_64-linux-gnu/10/include} $$ 3. **清除编译缓存** ```bash make clean # 清除常规编译产物 make mrproper # 清除所有配置和缓存(慎用) ``` 4. **指定交叉编译工具链**(仅限交叉编译) ```bash make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- ``` **注意:** 内核源码树中实际已包含$ \text{include/linux/stdarg.h} $,但编译系统会优先使用系统头文件[^3]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值