ESP32系列三: IDF 如何给工程新增文件夹与源文件(2)

本文详细介绍了如何在ESP32项目中使用CMake管理组件,包括添加自定义源文件、头文件,处理多级子目录,以及正确配置CMakeLists.txt和component.mk。重点讲解了组件的组织方式和依赖关系设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于使用习惯MDK的人来说换一种工具感觉很麻烦,特别是EPS32使用Cmake这种方式,之前研究了很久如何添加自己的源文件,以及添加后的种种问题,今天终于完全研究明白,通过本文可以了解所有的ESP32添加文件以及引用组件的方法。

本文主要介绍自定义组件多级子目录时CMakeLists.txt的写法,借鉴网络上的一些文章。项目是StudyInEsp32-master工程的部分代码目录结构。

如下的目录结构生成方法:

一、生成目录结构

先说下怎么生成这样的目录结构,步骤如下:

1. vscode安装插件,project-tree

2. 安装之后按ctrl+shift+p 或 直接F1打开命令输入框,并输入Project Tree回车

3. 点击要生成目录的项目,回车

4. 将项目目录生成并存储到README.md中

ESP32
├─ .gitignore
├─ .vscode
│  ├─ configurationCache.log
│  ├─ c_cpp_properties.json
│  ├─ dryrun.log
│  ├─ settings.json
│  └─ targets.log
├─ CMakeLists.txt
├─ components
│  └─ captive_portal
│     ├─ captive_portal.c
│     ├─ captive_portal.h
│     ├─ CMakeLists.txt
│     ├─ component.mk
│     ├─ dns_server
│     │  ├─ dns_server.c
│     │  └─ dns_server.h
│     ├─ http_server
│     │  ├─ cJSON
│     │  │  ├─ cJSON.c
│     │  │  └─ cJSON.h
│     │  ├─ index.html
│     │  ├─ my_http_server.c
│     │  ├─ my_http_server.h
│     │  └─ url_code
│     │     ├─ my_url_code.c
│     │     └─ my_url_code.h
│     ├─ soft_ap
│     │  ├─ console_app
│     │  │  ├─ cmd_system
│     │  │  │  ├─ cmd_system.c
│     │  │  │  └─ cmd_system.h
│     │  │  ├─ console_app.c
│     │  │  └─ console_app.h
│     │  ├─ my_soft_ap.c
│     │  └─ my_soft_ap.h
│     └─ wifi_station
│        ├─ wifi_station.c
│        └─ wifi_station.h
├─ main
│  ├─ app_main.c
│  ├─ CMakeLists.txt
│  └─ component.mk
├─ Makefile
├─ README.md
└─ sdkconfig

二、CMakeLists.txt写法说明

        由上面目录结构可以看到 项目中组件目录components下只有一个组件captive_portal,其它子目录都是在captive_portal目录下作为组件captive_portal所用到的模块,只有components根目录下的目录才算一个组件,所以当前项目的组件只有一个captive_portal (当然main严格上讲也属于一个组件,这里我们只讨论components下的组件)。

1、由上面的结构可以发现组件下的子目录并没有CMakeLists.txt和component.mk,实际上也不需要,只有每个组件根目录下才需要有CMakeLists.txt和component.mk(component.mk很多时候并不是必需的)。

2、那么组件子目录下的依赖组件或头文件目录及源文件引用信息该写在哪里呢?答案是写在当前组件根目录下的CMakeLists.txt和component.mk,只需要加上源文件或头文件目录的相对应前置目录即可。我们看一下组件captive-portal根目录下CMakeLists.txt的内容如下:

# compoments/captive-portal下的CMakeList文件
#加入源文件
#加入头文件
#加入组件依赖关系
#要加入当前目录下所有源文件,多个文件用空格分隔
#INCLUDE_DIRS .表示加入当前目录下所有头文件
#REQUIRES console nvs_flash 表明该组件依赖console和nvs_flash两个系统组件
# 调用idf_compoment_register函数向系统注册源文件和头文件
idf_component_register( SRCS  "captive_portal.c" #当前组件直接或间接用到的源文件列表
                              "./dns_server/dns_server.c"
                              "./http_server/my_http_server.c"
                              "./http_server/url_code/my_url_code.c"
                              "./wifi_station/wifi_station.c"
                              "./soft_ap/my_soft_ap.c"
                        INCLUDE_DIRS "."     #当前组件直接或间接用到的头文件目录列表
                                      "./wifi_station"
                                      "./http_server"
                                      "./http_server/url_code"
                                      "./dns_server"
                                      "./soft_ap"
                                      "$ENV{IDF_PATH}/components/esp_wifi/include"
                                      "$ENV{IDF_PATH}/components/nvs_flash/include"
                                      "$ENV{IDF_PATH}/components/esp_http_server/include" 
                        EMBED_FILES http_server/index.html  #将wifi.html文件内容以二进制形式(文本形式用EMBED_TXTFILES)添加到 Flash 的 .rodata 段
                        REQUIRES nvs_flash esp_http_server  #添加依赖的组件,否则会提示找不到头文件
                        REQUIRES nvs_flash nghttp
                        )
 

3、其中有一些.c源文件或头文件或依赖组件并不是由captive_portal.c直接使用的,可能是由其下的子目录使用,但当前组件captive_portal.c会间接使用到它,所以要把它们全部写在组件captive-portal根目录下CMakeLists.txt中,否则会报错找不到文件或变量未定义等。也即相当于把原子目录下的CMakeLists.txt全部合并到captive-portal组件根目录下的CMakeLists.txt。

4、同理,把原子目录下的component.mk内容全部合并到captive_portal根目录下的component.mk中,注意添加上对应目录即可。

5、对于编译出错找不到ESP32原有的头文件的时候,需要时引用REQUIRES来添加依赖的组件,否则提示找不到头文件,另外引用外部的文件,如html的时候也需要特殊的命令EMBED_FILES

三、component.mk写法说明

captive_portal根目录下的component.mk内容如下:

COMPONENT_EMBED_FILES := http_server/index.html  #将index.html文件内容以二进制形式(文本形式用EMBED_TXTFILES)添加到 Flash 的 .rodata 段(该内容原本位于http_server下的component.mk)

其中COMPONENT_EMBED_FILES := index.html 原本是在http_server目录下的component.mk内容,移到captive-portal组件根目录后要加上目录http_server/,否则无法查找到该文件。

ESP32开发中,添加文件夹的过程相对简单。以下是具体步骤: 1. 在工作目录中创建一个新文件夹。假设我们要创建一个名为“my_folder”的文件夹2. 将文件夹添加到`main/CMakeLists.txt`文件中。打开该文件,并找到以下代码: # Add main as a target target_sources(${PROJECT_NAME}.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/main.c ) 将其替换为以下代码: # Add main as a target target_sources(${PROJECT_NAME}.elf PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/main.c ${CMAKE_CURRENT_SOURCE_DIR}/my_folder ) 注意:在旧代码中,只有`main.c`被添加到项目中,而在新代码中,`my_folder`也被添加进去了。 3. 在文件夹中添加源文件。现在,你可以在`my_folder`中添加任何源代码或其他文件。只需将这些文件放在文件夹中即可。例如,如果你要添加一个名为“my_source.c”的源文件,则应将其放在`my_folder`中。 4. 刷新项目并重新生成它。如果你使用的是ESP-IDF的命令行界面,则只需运行以下命令即可: idf.py build 如果你使用的是Eclipse或其他IDE,则你需要按照相关IDE的说明进行刷新和重新生成。 5. 在您的项目中使用添加的文件夹。现在,您可以在您的项目中使用新添加的文件夹。例如,如果您添加了“my_source.c”,并希望将其包含在`main.c`中,则可以使用以下命令: #include "my_folder/my_source.c" 或者,如果您添加了其他文件,例如头文件,则可以使用以下命令: #include "my_folder/my_header.h" 完成上述步骤后,您就已经成功地将文件夹添加到您的ESP32项目中了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值