首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >构建linux模块- sys/time.h:没有这样的文件或目录

构建linux模块- sys/time.h:没有这样的文件或目录
EN

Ask Ubuntu用户
提问于 2021-12-09 10:34:16
回答 1查看 1.1K关注 0票数 0

我正试图用make -C ...在我的系统(Kubuntu21.10)中构建一个旧的linux驱动程序。驱动程序正在声明static struct timeval frame_timestamp;

如果我试着用这样的方法来建造它

代码语言:javascript
代码运行次数:0
运行
复制
make -C /lib/modules/`uname -r`/build M=`pwd` V=1  modules

我得到了... has an incomplete type ‘struct timeval’错误和其他相关错误。因此,我认为我必须将sys/time.h与#include 一起包含到代码中。但在这种情况下,我得到了fatal error: sys/time.h: No such file or directory。我找不到解决这个问题的方法。(代码已经包含了一些内容,但没有来自sys/,它们都来自linux/和media/)

最后我得到了一个下面的Makefile

代码语言:javascript
代码运行次数:0
运行
复制
obj-m := mydriver.o
KDIR := /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)

default:
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) M=$(PWD) V=1 modules

KDIR解析为链接到/usr/src/linux-headers-5.13.0-21-generic/lib/modules/5.13.0-21-generic/build。没有sys/time.h

locate sys/time.h返回:

代码语言:javascript
代码运行次数:0
运行
复制
/usr/include/i386-linux-gnu/sys/time.h
/usr/include/sys/time.h
/usr/include/x86_64-linux-gnu/sys/time.h

属于libc6-devlibc6-dev-i386:dpkg -l *5.13.0-21*给出:

代码语言:javascript
代码运行次数:0
运行
复制
ii  linux-headers-5.13.0-21                5.13.0-21.21 all          Header files related to Linux kernel version 5.13.0
ii  linux-headers-5.13.0-21-generic        5.13.0-21.21 amd64        Linux kernel headers for version 5.13.0 on 64 bit x86 SMP
ii  linux-image-5.13.0-21-generic          5.13.0-21.21 amd64        Signed kernel image generic
un  linux-image-unsigned-5.13.0-21-generic <нет>        <нет>        (описание недоступно)
ii  linux-modules-5.13.0-21-generic        5.13.0-21.21 amd64        Linux kernel extra modules for version 5.13.0 on 64 bit x86 >
ii  linux-modules-extra-5.13.0-21-generic  5.13.0-21.21 amd64        Linux kernel extra modules for version 5.13.0 on 64 bit x86

我试图将-I /usr/include/x86_64-linux-gnu/硬编码成make -C --这是没有效果的。我还尝试从kernel.org下载一个普通内核:https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.13.tar.xz,并将其硬编码为KDIR --这没有帮助,也不包含sys/time.h

问题是:如何强制我的模块构建过程查看sys/time.h?linux模块允许链接到libc吗?如果它不是内核的一部分,如何使它可用于模块构建过程?

EN

回答 1

Ask Ubuntu用户

发布于 2021-12-09 12:46:00

好的,似乎不能在内核模块中使用sys/time.h。我查看了struct v4l2_bufferlinux/videodev2.h中的定义,驱动程序应该使用struct timeval来初始化其timestamp字段,并在那里找到:

代码语言:javascript
代码运行次数:0
运行
复制
truct v4l2_buffer {
    __u32           index;
    __u32           type;
    __u32           bytesused;
    __u32           flags;
    __u32           field;
#ifdef __KERNEL__
    struct __kernel_v4l2_timeval timestamp;
#else
    struct timeval      timestamp;
#endif
    struct v4l2_timecode    timecode;
....

__KERNEL__是在make -C进程中自动定义的,所以最新的内核希望得到__kernel_v4l2_timeval。将struct timeval替换为struct __kernel_v4l2_timeval,再加上一些其他技巧,我就可以编译这个旧驱动程序了。

票数 -2
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/1380063

复制
相关文章

相似问题

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