解决 liburing 编译时缺失 `linux/time_types.h` 的问题

解决 liburing 编译时缺失 linux/time_types.h 的问题

引言

liburing 是 Linux 内核 io_uring 异步 I/O 接口的用户态封装库,极大简化了 io_uring 的使用。在嵌入式或较旧的 Linux 系统上编译 liburing 时,可能会遇到一个常见错误:缺少 linux/time_types.h 头文件。这个头文件属于 Linux 内核头文件的一部分,当系统内核头文件过旧或未完整安装时,就会导致编译失败。

本文将详细解释该错误的成因,并提供两种行之有效的解决方案。

问题描述

编译 liburing 时,可能出现类似如下的错误:

复制代码
fatal error: linux/time_types.h: No such file or directory
 #include <linux/time_types.h>

错误原因在于 liburing 的某些版本需要包含 linux/time_types.h,而该文件直到较新的内核版本(如 5.x 之后)才被引入。若编译环境中的内核头文件较老或不完整,就会触发该错误。

解决方案

方案一:清理并重新运行 configure(推荐)

liburing 的开发者已经在 configure 脚本中实现了对 linux/time_types.h 的自动检测。当脚本检测到该头文件缺失时,会自动定义一个宏 UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H,从而在源码中跳过对该头文件的包含,并使用库自身定义的兼容结构。

执行以下命令:

bash 复制代码
cd /root/dev_armv7l/liburing
make clean
./configure
make

这样 configure 会生成正确的配置,然后 make 将顺利编译。

方案二:手动定义跳过宏

如果 configure 脚本未能自动解决问题(例如使用的 liburing 版本较老),您可以手动在编译选项中定义该宏。

通过 configure 传递 CFLAGS:

bash 复制代码
cd /root/dev_armv7l/liburing
./configure --cflags="-DUAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H"
make

或者直接在执行 make 时添加 CFLAGS:

bash 复制代码
cd /root/dev_armv7l/liburing
make CFLAGS="-DUAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H"

定义该宏后,liburing 源码中的 io_uring.h 将跳过 #include <linux/time_types.h>,并使用内部定义的时间结构,从而成功编译。

为什么有效?

liburing 的提交记录和源码中可以看到,io_uring.h 已经做了条件包含处理:

c 复制代码
#ifdef UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H
/* 使用内部定义 */
#else
#include <linux/time_types.h>
#endif

当系统缺少 linux/time_types.h 时,通过定义 UAPI_LINUX_IO_URING_H_SKIP_LINUX_TIME_TYPES_H,就可以避免包含不存在的文件,同时 liburing 自身提供了必要的替代定义。这种方法已经在多个旧系统上验证有效。

总结

编译 liburing 时遇到 linux/time_types.h 缺失的错误,主要是由于内核头文件版本过旧。最简单的修复方法是清理后重新运行 configure ,让脚本自动适配;若自动检测失败,则可通过手动定义宏来强制跳过缺失头文件。这两种方法都能让 liburing 顺利编译,无需升级整个系统的内核头文件。

相关推荐
码农学院18 分钟前
基于运维监控体系的网络品牌推广方案:从架构设计到技术实现
运维·网络
爱写代码的森7 小时前
鸿蒙三方库 | harmony-utils之ImageUtil图片保存到本地详解
服务器·华为·harmonyos·鸿蒙·huawei
大耳朵-小飞象9 小时前
电力安全运维的智能密码:BACS如何破解设备全生命周期管理难题,让电网安全“看得见、管得住”?
运维·安全·智慧城市·能耗系统·楼宇智控·未来生活
极客侃科技10 小时前
制造企业 MES/APS 选型:SAP PP/DS 集成、ERP-MES 边界划分与一体化架构要点
运维·架构·制造
HLC++10 小时前
Linux的进程间通信
android·linux·服务器
华清远见IT开放实验室11 小时前
实验室建设案例 | 石家庄科技信息职业学院嵌入式实验室——从底层硬件到系统应用,一所应用型高校的嵌入式人才培养这样落地
linux·arm开发·stm32·嵌入式硬件·高校·实验室建设
白露与泡影12 小时前
Arthas 实战指南:从方法耗时定位到 JVM 变量热修改
服务器·jvm·c#
神奇霸王龙13 小时前
Claude Code屠榜:MiMo与Grok紧追Codex
服务器·网络·人工智能·gpt·ai·ai编程
Web极客码13 小时前
WordPress SEO优化:提升网站排名的13个关键步骤
服务器·seo·wordpress
生活爱好者!13 小时前
我把NAS当作下载机,docker一键部署qb
运维·docker·容器