顶层目录可识别的lvgl库在子目录中无法识别的CMake问题求助
解决子目录文件无法识别LVGL库的CMake配置问题
问题分析
当前配置存在几个关键问题:
- 子目录源文件未纳入构建:
ui/Screens/blah.c既没添加到app的源文件列表,也没加入ui库的编译目标,根本没参与构建。 - ui库未获取LVGL头文件路径:顶层仅给app添加了ui目录的include路径,但ui库本身没有关联LVGL的头文件查找路径,导致其内部文件找不到LVGL相关头文件。
- 重复编译源文件:
ui/ui.c同时出现在app的app_SRCS和ui库的源文件中,会触发重复编译错误。
修改步骤
1. 更新ui目录下的CMakeLists.txt
修改ui/CMakeLists.txt,将Screens子目录的源文件纳入ui库,并让ui库继承Zephyr的编译接口(自动获取LVGL等依赖的头文件路径):
# 包含所有ui相关源文件,包括Screens子目录 set(UI_SOURCES "ui.c" "Screens/blah.c" ) add_library(ui ${UI_SOURCES}) # 让ui库继承Zephyr的编译接口,自动获取LVGL等依赖的头文件和编译选项 target_link_libraries(ui PRIVATE zephyr_interface) # 暴露ui目录的头文件路径给依赖它的目标(比如app) target_include_directories(ui PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
2. 调整顶层CMakeLists.txt
移除重复的源文件,简化include路径配置:
cmake_minimum_required(VERSION 3.20.0) find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE}) project(SomeProject) # 引入子目录 set(subdirs ui ) foreach(subdir ${subdirs}) add_subdirectory(${subdir}) endforeach() # 让app依赖ui库 target_link_libraries(app PRIVATE ${subdirs}) # 仅保留app自身的源文件,移除重复的ui/ui.c set(app_SRCS main.c ) target_sources(app PRIVATE ${app_SRCS})
额外说明
- 通过
target_link_libraries(ui PRIVATE zephyr_interface),ui库会自动继承Zephyr所有依赖的头文件路径,包括LVGL,解决子目录文件找不到LVGL头文件的问题。 target_include_directories(ui PUBLIC ...)会自动将ui目录的头文件路径传递给app,无需在顶层单独配置。
内容的提问来源于stack exchange,提问作者SingleMaltWh1sky
相关产品推荐
相关产品推荐

