我有一个需要编译的树外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)
答案 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”。应该可以解决问题。