编译含<linux/nvme.h>的NVME工具报错:文件不存在,求正确解决方案
关于<linux/nvme.h>找不到的问题及正确使用方法
为什么<linux/nvme.h>不在/usr/include目录
<linux/nvme.h>是内核态专属头文件,属于内核源码的一部分,并非用户空间程序的标准头文件。/usr/include下存放的是用户态程序可直接调用的标准库、用户态API头文件,内核头文件默认不会被安装到这个路径。- 内核头文件的定义是为内核态代码设计的,包含大量内核内部依赖的结构体、宏,直接在用户态程序中引用会引发用户态与内核态的类型定义冲突,这也是你手动添加
-I参数后编译混乱的核心原因。
正确的使用方式
方法一:使用libnvme库(推荐)
libnvme是官方提供的用户态NVMe工具库,专门封装了NVMe操作的用户态API,完全替代直接引用内核头文件的需求:
- 安装开发包(以Debian/Ubuntu为例):
sudo apt install libnvme-dev - 编译时链接库:
gcc your_program.c -o your_program -lnvme - 代码中引用
<libnvme.h>,它会提供你需要的NVMe命令结构体、宏定义,且完全适配用户态环境,避免内核头文件的兼容性问题。
方法二:使用用户态兼容的内核头文件(仅特殊场景)
如果必须直接使用内核nvme.h的定义,需通过规范方式获取用户态兼容的内核头文件路径:
- 先安装linux-libc-dev包(提供用户态可用的内核头文件子集):
sudo apt install linux-libc-dev - 编译时借助
pkg-config获取正确的头文件路径,避免硬编码:gcc your_program.c -o your_program $(pkg-config --cflags linux) - 注意:这种方式仍可能出现用户态与内核态的定义冲突,仅建议在无法使用libnvme的特殊场景下尝试。
内容的提问来源于stack exchange,提问作者S.G
相关产品推荐
相关产品推荐

