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

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的普通工程,按以下步骤配置:

  1. 根目录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)
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 04:06:09