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

