Anwser
解决!!感谢@IanAbbott
标题应为:
#include <linux/ktime.h>
#include <linux/timekeeping.h>
而不是<linux/time.h>
.
更多详细信息请参阅讨论。
原始问题
我正在编写一个系统调用名称sys_my_time.c
,它将使用getnstimeofday()
。我已经导入了<linux/time.h>
.代码是这样的:
#include <linux/kernel.h>
#include <linux/linkage.h>
#include <linux/time.h>
asmlinkage int sys_my_time() {
struct timespec t;
getnstimeofday(&t);
// ...
return 0;
}
但在编译时,错误显示:
CC kernel/sys_my_time.o
kernel/sys_my_time.c: In function ‘sys_my_time’:
kernel/sys_my_time.c:8:3: error: implicit declaration of function ‘getnstimeofday’ [-Werror=implicit-function-declaration]
getnstimeofday(&t);
^
cc1: some warnings being treated as errors
scripts/Makefile.build:320: recipe for target 'kernel/sys_my_time.o' failed
make[1]: *** [kernel/sys_my_time.o] Error 1
Makefile:1029: recipe for target 'kernel' failed
make: *** [kernel] Error 2
我不知道为什么会发生错误。
附言在 Ubuntu 16.04 中编译内核 V4.14.25
从内核版本 3.17.x 开始,#include <linux/time.h>
不再声明getnstimeofday
。解决方案是添加:
#include <linux/ktime.h>
根据内核版本,#include <linux/ktime.h>
将从<linux/time.h>
(3.17.x 之前(或<linux/timekeeping.h>
(3.17.x 及更高版本(提取getnstimeofday
声明。无需直接包含<linux/timekeeping.h>
。
请注意,<linux/ktime.h>
从 Linux 内核 2.6.16 开始就可用了。
如果其中没有其他需要使用的内容,您可以删除#include <linux/time.h>
。通过删除该行并为任何内核 3.17.x 或更高版本构建代码来测试这一点。