我需要编译一个树外的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)
在再次运行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.
4条答案
按热度按时间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.brjng4g32#
我在使用CentOS 9时遇到了同样的问题,其他的答案对我来说都不起作用。显然,问题是在最近的内核中,它不应该是
<stdarg.h>
,而应该是<linux/stdarg.h>
。使用virtualbox guest additions 6.1.34,它可以正确地检查内核的版本是否为5.15.0或更高。但我的内核是5.14.xx。意味着stdarg.h
的包含是错误的。解决问题
依赖项
安装访客版本的所有依赖项
安装
像平常一样运行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)
。编译内核模块
现在我们可以编译内核模块,错误应该消失了。
我个人第一次得到了一个错误,但后来我重新编译,没有改变任何东西,它的工作。
请记住,这只是一个变通办法,它可能无法与不同的版本。
dz6r00yl3#
如果您使用的是带有zen-kernel的Arch Linux:
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文件夹
并将CD驱动器安装到该文件夹
在我艾德到/mnt/iso之后
并手动运行VirtualBoxGuestAdditions.run脚本
它成功地编译并安装了所需的虚拟机客户模块。现在每次我更新内核版本时,我都会重复同样的过程。它工作得很好。它还删除了旧的6. 1. 0客户附加组件文件夹。