我正试图用make -C ...
在我的系统(Kubuntu21.10)中构建一个旧的linux驱动程序。驱动程序正在声明static struct timeval frame_timestamp;
如果我试着用这样的方法来建造它
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
:
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
返回:
/usr/include/i386-linux-gnu/sys/time.h
/usr/include/sys/time.h
/usr/include/x86_64-linux-gnu/sys/time.h
属于libc6-dev
和libc6-dev-i386:
。dpkg -l *5.13.0-21*
给出:
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吗?如果它不是内核的一部分,如何使它可用于模块构建过程?
发布于 2021-12-09 12:46:00
好的,似乎不能在内核模块中使用sys/time.h
。我查看了struct v4l2_buffer
在linux/videodev2.h
中的定义,驱动程序应该使用struct timeval
来初始化其timestamp
字段,并在那里找到:
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
,再加上一些其他技巧,我就可以编译这个旧驱动程序了。
https://askubuntu.com/questions/1380063
复制相似问题