You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu系统中通过CMake查找内核头文件失败的求助

Ubuntu下CMake定位x86内核头文件问题解决

问题背景

需要引入<asm/barrier.h>和<asm/msr.h>头文件,文件实际位于/usr/src/linux-headers-6.5.0-27/arch/x86/include/asm路径下,但CMake始终无法找到正确路径,尝试多种写法均失败:

尝试1:

find_path(KERNELHEADERS_DIR
  include/asm/barrier.h
)

尝试2:

execute_process(
  COMMAND uname -r
  OUTPUT_VARIABLE KERNEL_RELEASE
  OUTPUT_STRIP_TRAILING_WHITESPACE
)

string(REPLACE "-generic" "" KERNEL_RELEASE  "${KERNEL_RELEASE}")

# Find the headers
find_path(KERNELHEADERS_DIR
  include/asm/barrier.h
  PATHS /usr/src/linux-headers-${KERNEL_RELEASE}
)

补充尝试(指定完整路径仍失败):

先通过命令确认文件存在:

$ ls -l /usr/src/linux-headers-6.5.0-27/arch/x86/include/asm/barrier.h
-rw-r--r-- 1 root root 2939 Aug 27  2023 /usr/src/linux-headers-6.5.0-27/arch/x86/include/asm/barrier.h

使用以下CMake代码仍返回找不到:

find_path(
  KERNEL_INCLUDE_DIR
  asm/barrier.h
  PATHS /usr/src/linux-headers-6.5.0-27/arch/x86
)
message(STATUS "KERNEL_INCLUDE_DIR = ${KERNEL_INCLUDE_DIR}")

输出:

KERNEL_INCLUDE_DIR = KERNEL_INCLUDE_DIR-NOTFOUND

需要一个适用于Ubuntu的简单方案,用于YOMM2基准测试。


解决方法

方案1:直接硬编码路径(最快)

既然明确知道头文件位置,跳过find_path直接添加包含目录:

# 添加x86架构相关头文件目录
include_directories(/usr/src/linux-headers-6.5.0-27/arch/x86/include)
# 按需添加内核通用头文件目录
include_directories(/usr/src/linux-headers-6.5.0-27/include)

之后代码里的#include <asm/barrier.h>就能正确解析。

方案2:动态指定内核版本

如果不想硬编码版本号,可通过变量控制目标内核版本:

# 设置目标内核版本
set(TARGET_KERNEL_VER "6.5.0-27")

# 拼接完整路径
set(KERNEL_ARCH_INC "/usr/src/linux-headers-${TARGET_KERNEL_VER}/arch/x86/include")
set(KERNEL_COMMON_INC "/usr/src/linux-headers-${TARGET_KERNEL_VER}/include")

# 添加包含目录
include_directories(${KERNEL_ARCH_INC})
include_directories(${KERNEL_COMMON_INC})

# 可选:验证路径有效性
if(NOT EXISTS "${KERNEL_ARCH_INC}/asm/barrier.h")
  message(FATAL_ERROR "请先安装linux-headers-${TARGET_KERNEL_VER}包")
endif()

修复之前的find_path写法

之前的find_path失败是因为没指定PATH_SUFFIXES,正确写法应该是:

find_path(
  KERNEL_INCLUDE_DIR
  NAMES asm/barrier.h
  PATHS /usr/src/linux-headers-6.5.0-27/arch/x86
  PATH_SUFFIXES include
)
message(STATUS "KERNEL_INCLUDE_DIR = ${KERNEL_INCLUDE_DIR}")

加上PATH_SUFFIXES include后,CMake会在指定路径的include子目录下查找文件,就能正确定位到/usr/src/linux-headers-6.5.0-27/arch/x86/include。


内容的提问来源于stack exchange,提问作者yorel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 19:46:34