CMake&ESP-IDF:如何将组件作为子文件夹引入?
如何通过CMake配置实现指定头文件引入方式?
项目结构
. ├── components │ ├── drivers │ │ ├── usb │ │ │ ├── usb.c │ │ │ └── usb.h │ │ ├── lcd │ │ │ └── lcd相关源文件/头文件 │ │ └── etc │ └── 其他组件 └── main └── main.c
需求
希望在main.c中以如下方式引入头文件:
#include "drivers/usb.h" #include "drivers/lcd.h"
之前的问题
尝试将子文件夹设为PRIV_INCLUDE_DIRS后,只能用#include "usb/usb.h"的方式引入,不符合预期。
解决方案
针对ESP-IDF项目
ESP-IDF的组件系统通过idf_component_register管理,只需修改components/drivers/CMakeLists.txt:
idf_component_register( SRCS "usb/usb.c" "lcd/lcd.c" # 列出drivers组件下所有源文件 INCLUDE_DIRS "." # 将drivers组件的根目录设为公共包含目录 )
INCLUDE_DIRS "."会把components/drivers目录添加到全局头文件搜索路径,编译器能识别drivers顶层文件夹,从而支持#include "drivers/usb.h"的引入方式。- 根目录
CMakeLists.txt保持ESP-IDF标准结构即可,它会自动扫描components目录下的组件:
cmake_minimum_required(VERSION 3.16) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(你的项目名称)
针对普通CMake项目
如果是未使用ESP-IDF的普通工程,按以下步骤配置:
- 根目录CMakeLists.txt
cmake_minimum_required(VERSION 3.16) project(你的项目名称) # 将components目录添加到全局公共包含路径 include_directories(components) # 构建主程序目标 add_executable(你的项目名称 main/main.c) # 链接drivers静态库 add_subdirectory(components/drivers) target_link_libraries(你的项目名称 drivers)
- components/drivers/CMakeLists.txt
# 构建drivers静态库 add_library(drivers STATIC usb/usb.c lcd/lcd.c) # 将drivers目录设为公共包含目录 target_include_directories(drivers PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
配置完成后,即可在main.c中用#include "drivers/usb.h"的方式引入头文件。
内容的提问来源于stack exchange,提问作者Ananth Narayanan
相关产品推荐
相关产品推荐

