首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在编译出树型Linux内核模块时,如何解决stdarg.h没有这样的文件或目录?

在编译出树型Linux内核模块时,如何解决stdarg.h没有这样的文件或目录?
EN

Stack Overflow用户
提问于 2019-02-01 13:42:33
回答 3查看 18.6K关注 0票数 7

我有一个树外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-泛型)

EN

回答 3

Stack Overflow用户

发布于 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“。它应该能解决这个问题。

票数 4
EN

Stack Overflow用户

发布于 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的包含是错误的。

解决问题

依赖关系

安装来宾版本的所有依赖项。

代码语言:javascript
运行
复制
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)

编译内核模块

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

代码语言:javascript
运行
复制
sudo rcvboxadd quicksetup all

我第一次就得到了一个错误,但是后来我重新编译了,没有改变任何东西,它起了作用。

请记住,这只是一个解决办法,它可能不适用于不同的版本。

票数 1
EN

Stack Overflow用户

发布于 2022-04-27 11:06:37

如果您将Arch Linux与zen-内核结合使用:

代码语言:javascript
运行
复制
sudo CPATH=/usr/src/linux-zen/include/linux vmware-modconfig --console --install-all
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54480765

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档