编译树外Linux内核模块时,如何解决stdarg.h没有此类文件或目录?

时间:2019-02-01 13:42:33

标签: linux

我有一个需要编译的树外Linux内核模块。当我在内核模块目录中执行“ make”时,我得到:

"fatal error: stdarg.h: No such file or directory"

在开始构建之前,我根据Linux发行版安装了头文件。

$sudo apt-get install kernel-headers-$(uname -r)

如何解决此编译错误? (我的发行版是Ubuntu 16.04,带有linux-headers-4.15.0-42-generic)

1 个答案:

答案 0 :(得分:0)

我使用“ 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之前,请进行清洁。在文件夹中进行ls -la 并查找“ .cache.mk”文件。如果仍然存在,请将其删除,然后再次运行“ make”。应该可以解决问题。