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
相关产品推荐
相关产品推荐

