我有一个树外Linux内核模块,我需要编译.当我在内核模块目录中执行"make“时,我得到:
"fatal error: stdarg.h: No such file or directory"
在开始构建之前,我根据Linux发行版安装了头文件。
$sudo apt-get install kernel-headers-$(uname -r)
如何解决此编译错误?(我的发行版是Ubuntu16.04,带有linux 4.15.0-42-泛型)
发布于 2019-02-01 13:42:33
我使用"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/i 686-Linuxgnu/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。在文件夹中执行ls -la
并查找".cache.mk“文件。如果这个仍然在那里,删除它并再次运行"make“。它应该能解决这个问题。
发布于 2022-07-22 14:48:24
我对CentOS 9也有同样的问题,其他的答案对我没有用。显然问题在于,在最近的内核中,它不应该是<stdarg.h>
,而应该是<linux/stdarg.h>
。随着virtualbox客户添加6.1.34,它将正确检查版本为5.15.0或更高版本的内核。但是我的内核是5.14.xx,这意味着stdarg.h
的包含是错误的。
解决问题
依赖关系
安装来宾版本的所有依赖项。
gcc make perl kernel-devel kernel-headers bzip2 dkms
安装
按照正常情况运行来宾附加安装。如果说它无法编译内核模块,就会失败。这是意料之中的。它将把我们需要的所有文件复制到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
我第一次就得到了一个错误,但是后来我重新编译了,没有改变任何东西,它起了作用。
请记住,这只是一个解决办法,它可能不适用于不同的版本。
发布于 2022-04-27 11:06:37
如果您将Arch Linux与zen-内核结合使用:
sudo CPATH=/usr/src/linux-zen/include/linux vmware-modconfig --console --install-all
https://stackoverflow.com/questions/54480765
复制相似问题