You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu16.04下编译ldd3内核模块遇头文件找不到问题求助

解决编译ldd3内核模块时找不到linux/sched/signal.h的问题

我来帮你一步步排查解决这个问题,你遇到的情况很常见,主要是内核模块编译的几个关键环节没处理到位:

1. 先确保内核源码已完成配置与预处理

克隆内核源码后不能直接用来编译模块,必须先生成模块编译所需的依赖文件与头文件索引:

  • 进入你的内核源码目录(替换成你实际的用户名):
    cd /home/your-actual-username/linux/
    
  • 复制当前系统的内核配置文件(Ubuntu 16.04的配置存放在/boot目录):
    cp /boot/config-$(uname -r) .config
    
  • 执行预处理命令,补全内核编译依赖:
    make prepare
    make modules_prepare
    
    这两个命令会整理内核头文件结构,生成模块编译必须的索引信息。

2. 修正KERNELDIR环境变量的路径格式

你设置变量时写的/home/"username"/linux/里的引号是多余的,会导致路径识别错误,应该替换成你真实的用户名(比如你的用户名为woo-hyun,就写成/home/woo-hyun/linux):

export KERNELDIR=/home/your-actual-username/linux

设置后可以用echo $KERNELDIR确认路径是否正确指向内核源码目录。

3. 检查模块目录的Makefile是否正确引用KERNELDIR

打开misc-modules目录下的Makefile,确认它的编译规则是否正确调用了你指定的内核源码,标准的内核模块Makefile应该类似这样:

obj-m += jit.o
KDIR ?= $(KERNELDIR)
PWD := $(shell pwd)

default:
	$(MAKE) -C $(KDIR) M=$(PWD) modules

clean:
	$(MAKE) -C $(KDIR) M=$(PWD) clean

如果原Makefile没有使用$(KERNELDIR),请修改成上述格式,确保编译时会读取你指定的内核源码中的编译规则。

4. 核对内核版本与ldd3代码的兼容性

ldd3是基于2.6.x内核的书籍,如果你克隆的是较新的内核版本,可能存在头文件结构或API的差异。如果前面的步骤都完成后仍有问题,可以尝试克隆Ubuntu 16.04默认匹配的4.4.x版本内核,兼容性会更好。

完成以上步骤后,回到misc-modules目录重新执行sudo make,应该就能正常编译了。

内容的提问来源于stack exchange,提问作者Woo-Hyun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:52:44