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

添加add_executable()后Zephyr项目编译报错:找不到zephyr/kernel.h

Zephyr独立项目添加add_executable()后编译报错:找不到zephyr/kernel.h

问题场景

你的独立项目存放于Zephyr根目录外,原CMakeLists.txt配置可正常编译烧录:

cmake_minimum_required(VERSION 3.20.0)
set (BOARD esp32)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(sample)
FILE(GLOB app_sources src/*.c)
target_sources(app PRIVATE ${app_sources})

但添加add_executable(appexe ${app_sources})语句后,编译报错:fatal error: zephyr/kernel.h: No such file or directory。

原因分析

Zephyr的CMake构建框架在执行find_package(Zephyr ...)时,会自动创建一个名为app的可执行目标,同时为这个目标配置好所有Zephyr相关的编译选项、头文件搜索路径、宏定义、链接库等关键配置。而你手动调用add_executable()创建的appexe目标,是一个全新的、未经过Zephyr配置的CMake目标,自然找不到Zephyr内核的头文件。

解决方法

1. 放弃手动创建可执行目标(推荐)

直接使用Zephyr自动生成的app目标即可,原配置里的target_sources(app PRIVATE ${app_sources})已经是正确的代码组织方式,无需额外调用add_executable()。

2. 若需自定义库目标

如果确实需要拆分代码为独立库,不要直接用add_library()后就不管,必须让库目标继承Zephyr的配置,并链接到app目标:

# 创建自定义静态库
add_library(my_custom_lib STATIC src/my_lib.c)
# 让库继承Zephyr的编译配置(头文件、宏定义等)
target_link_libraries(my_custom_lib PRIVATE zephyr_interface)
# 将自定义库链接到Zephyr的app目标
target_link_libraries(app PRIVATE my_custom_lib)

总结

Zephyr的CMake框架已经封装了嵌入式项目的整套构建逻辑,尽量使用它提供的app目标来组织代码,避免手动创建新的可执行目标——否则你需要手动复制所有Zephyr为app配置的编译参数,这不仅繁琐,还容易遗漏关键配置导致各种编译错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 20:57:09