如何解决在编译树外Linux内核模块时没有这样的文件或目录的问题?

2guxujil  于 2023-02-07  发布在  Linux
关注(0)|答案(4)|浏览(493)

我需要编译一个树外的Linux内核模块,当我在内核模块目录中执行make时,我得到:
"fatal error: stdarg.h: No such file or directory"
在开始构建之前,我安装了基于Linux发行版的头文件。
$sudo apt-get install kernel-headers-$(uname -r)
我该如何解决这个编译错误?(我的发行版是Ubuntu 16.04 with linux-headers-4.15.0-42-generic)

xqk2d5yq

xqk2d5yq1#

我用"locate"命令搜索了stdarg.h,看看是否可以在系统上运行该文件。
我得到了:
/usr/include/c++/5/tr1/stdarg.h
/usr/lib/gcc/i686-linux-gnu/5/include/cross-stdarg.h
/usr/lib/gcc/i686-linux-gnu/5/include/stdarg.h
...
它告诉我编译器至少提供了一个stdarg. h。
我尝试在内核模块Makefile中包含路径"/usr/lib/gcc/i686-linux-gnu/5/include ",这样stdarg. h就可以被选中,但没有成功(在构建时,官方内核头文件中对stdarg. h的另一个引用没有被解析)。
最后我在下面创建了一个符号链接:/usr/src/linux-headers-4.15.0-42-generic/include
$sudo ln -s /usr/lib/gcc/i686-linux-gnu/5/include/stdarg.h stdarg.h
这足以解决编译问题。
我想知道内核头文件是否应该在默认情况下随附stdarg. h的实现(这是我第一次遇到这个问题)。我还读到编译器提供了一个实现,大多数时候使用编译器版本会更好。

    • 更新注解:**如果上述解决方案仍不能解决问题:

在再次运行make之前,请执行make clean。在文件夹中执行ls -la并查找."www.example.com"文件。如果该文件仍然存在,请将其删除并再次运行make。这样应该可以解决问题。cache.mk" file. If this is still there, remove it and run "make" again. It should solve the problem.

brjng4g3

brjng4g32#

我在使用CentOS 9时遇到了同样的问题,其他的答案对我来说都不起作用。显然,问题是在最近的内核中,它不应该是<stdarg.h>,而应该是<linux/stdarg.h>。使用virtualbox guest additions 6.1.34,它可以正确地检查内核的版本是否为5.15.0或更高。但我的内核是5.14.xx。意味着stdarg.h的包含是错误的。

解决问题

依赖项

安装访客版本的所有依赖项

gcc make perl kernel-devel kernel-headers bzip2 dkms

安装
像平常一样运行Guest Addition安装。它会失败,并说它无法编译内核模块。这是意料之中的。它会将我们需要的所有文件复制到VM磁盘。
编辑
现在我们需要编辑错误的文件。

  • /opt/VBoxGuestAdditions-6.1.34/src/vboxguest-6.1.34/vboxguest/include/iprt/stdarg.h
  • /opt/VBoxGuestAdditions-6.1.34/src/vboxguest-6.1.34/vboxsf/include/iprt/stdarg.h

在第48行(不同版本可能会有所不同),它检查Linux版本并根据版本选择正确的头文件,我们需要在两个文件中将if RTLNX_VER_MIN(5,15,0)替换为if RTLNX_VER_MIN(5,14,0)

编译内核模块

现在我们可以编译内核模块,错误应该消失了。

sudo rcvboxadd quicksetup all

我个人第一次得到了一个错误,但后来我重新编译,没有改变任何东西,它的工作。
请记住,这只是一个变通办法,它可能无法与不同的版本。

dz6r00yl

dz6r00yl3#

如果您使用的是带有zen-kernel的Arch Linux:

sudo CPATH=/usr/src/linux-zen/include/linux vmware-modconfig --console --install-all
dw1jzc5e

dw1jzc5e4#

我在运行内核为6.1.9的archlinux的VirtualBox 6.1.0中遇到了同样的问题。我从https://download.virtualbox.org/virtualbox/7.0.2/链接下载了VirtualBoxGuestAdditions_7.2.0.iso文件(您可以选择更适合您的VirtualBox版本)并指定为virtualbox机器的光驱。系统启动后,在终端上运行blkid命令,显示CD rom设备的名称为**/dev/sr 0**。然后我在上创建了iso文件夹
/mnt文件夹

mkdir /mnt/iso

并将CD驱动器安装到该文件夹

mount -o loop /dev/sr0 /mnt/iso

在我艾德到/mnt/iso之后

cd /mnt/iso

并手动运行VirtualBoxGuestAdditions.run脚本

sh ./VirtualBoxGuestAdditions.run

它成功地编译并安装了所需的虚拟机客户模块。现在每次我更新内核版本时,我都会重复同样的过程。它工作得很好。它还删除了旧的6. 1. 0客户附加组件文件夹。

相关问题