当前位置:网站首页>ESP32-添加多目录的自定义组件
ESP32-添加多目录的自定义组件
2022-06-27 00:13:00 【NULL_1969】
前言
在esp32开发中,一般用的是vscode。没有像keil mdk等集成开发环境,这就对不熟悉cmake的人士不太友好。笔者也是参阅了cmake官方文档以及esp32开发手册,找到一个非常有效的以及简单的CmakeList.txt的编写方式。
esp32工程目录

esp官方比较推荐的目录格式是有两个文件夹,一个是main文件夹,一个是components文件夹,这两个文件夹的名称不建议更改,这两个是esp32开发环境默认的main模块和components模块。
esp32采用的cmake编译工具。当添加了新的文件后需要自己编写cmakelist.txt。这里主要重点说下components文件夹。
components文件夹

components文件夹下的每个子文件夹esp-idf环境会认为其是一个模块。比如上图中a,lvgl,sda都是一个模块。在每个子模块的根目录下需要新建一个CMakeLists.txt。比如上图a目录下就有一个CMakeLists.txt,仅需要这一个.mk文件是不必要的。a的子目录里面只用放自己需要的源码就行,不要再放CMakeLists.txt。如下图:
模块a有3个子目录具体关系如下:

模块a有多个子目录且子目录包含有.h和.c文件,那么Cmakelists.txt怎么写呢。
file(GLOB_RECURSE SOURCES src_a/*.c src_b/*.c)
set(include_dirs
inc_a
src_a
src_a/src_c
)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${include_dirs})
上面就是模块a的Cmakelists.txt全文,是不是很简洁。项目具体解析下。
先说最简单的set。set是给一个变量赋值,上面就是将inc_a src_a src_a/src_c这三个文件夹赋值给include_dirs。只需要将用到的头文件文件夹添加到set里面即可。通过“$”来取得include_dirs变量的值。这个linux下bash语法一致。
idf_component_register 这是esp-idf添加模块的命令,这里一般是添加源文件和头文件,分别用SRCS 和INCLUDE_DIRS关键字表示,这两个关键字后面可以用多个 变量
比如:
idf_component_register(SRCS ${SOURCES} "123.c"
INCLUDE_DIRS ${include_dirs} . "123.h" "inc_a"
)
- "."表示为当前目录下的文件
- INCLUDE_DIRS 后面可以直接跟目录名称
- SRCS 后面必须跟具体的文件,不能使用目录代替,这个经过测试用目录是无效的,所以当模块内部有多个.c文件,按照上面的方式就要一个一个添加.c文件。这样也太麻烦了吧,如果有大量的.c文件,那工作量太大了,但是esp32的开发手册中没有给出具体的办法。但是可定有办法可以让.c文件按照目录方式添加索引。
经过百度和大量测试,可以使用的file这个命令。详细解释见https://cmake.org/cmake/help/latest/command/file.html
file命令用于文件系统时主要有两个语法
file(GLOB <variable>
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
file(GLOB_RECURSE <variable> [FOLLOW_SYMLINKS]
[LIST_DIRECTORIES true|false] [RELATIVE <path>] [CONFIGURE_DEPENDS]
[<globbing-expressions>...])
官方的对这个命令的解释是,生成一个符合规则的列表,并将给列表赋值给。官方不建议采用GLOB 命令,改命令不能读取到索引的自索引。
如果将file(GLOB_RECURSE SOURCES src_a/.c src_b/.c)中的GLOB_RECURSE改为GLOB ,编译会不成功,显示找不到sumc函数,sumc函数位于src_a/src_c文件夹下面。
当时目前还有一个问题
当添加了新的.c文件到src_a下面的时候,需要重新编辑下Cmakelists.txt,编译的时候才能正常识别到新添加的.c文件,暂时还没有找到能够自动更新的方法。
添加LVG组件
当时研究这个方法的目的就是要一直lvgl。lvgl8.2的目录结构如下;
其中CMakeLists.txt内容如下:
file(GLOB_RECURSE SOURCES src/*.c examples/porting/*.c )
set(included_dirs src examples/porting)
idf_component_register(SRCS ${SOURCES}
INCLUDE_DIRS ${included_dirs}
)
通过file这种方法可以非常方便的添加大量的.c源文件。本次实验的项目见:
https://download.csdn.net/download/sinat_36568888/85751343
边栏推荐
- 【Mysql】时间字段默认设置为当前时间
- kubeadm创建kubernetes集群
- 敲重点!最全大模型训练合集!
- Encapsulate servlet unified processing request
- Is there anyone who doesn't know the three cores of concurrent programming?
- JS library for number formatting
- Simulation of delta variant strain of novel coronavirus (mindsponge application)
- Lambda表达式
- Other service registration and discovery
- 解决STC8G1K08程序不能运行的问题和端口配置
猜你喜欢

深度学习方法求解平均场博弈论问题

MindSpore新型轻量级神经网络GhostNet,在ImageNet分类、图像识别和目标检测等多个应用场景效果优异!

Lambda expression

matlab数据类型 —— 字符型

【UVM实战 ===> Episode_3 】~ Assertion、Sequence、Property

CEC-I 中华学习机使用说明与问答

Deep learning method for solving mean field game theory problems

这3个并发编程的核心,竟然还有人不知道?

Le principe le plus complet de formation à la précision hybride pour l'ensemble du réseau

敲重点!最全大模型训练合集!
随机推荐
Technical dry goods | what is a big model? Oversized model? Foundation Model?
解决u8glib只显示一行文字或者不显示的问题
光谱共焦如何测量玻璃基板厚度
这10款文案神器帮你速码,做自媒体还担心写不出文案吗?
matlab数据类型 —— 字符型
Encapsulate servlet unified processing request
统一结果集的封装
Overview of Freescale MCU
超越锂电池——未来电池的概念
Kubeadm create kubernetes cluster
目标追踪拍摄?目标遮挡拍摄?拥有19亿安装量的花瓣app,究竟有什么别出心裁的功能如此吸引用户?
目前哪个证券公司炒股开户是最好最安全的?
Employment prospect of GIS and remote sensing specialty and ranking selection of universities in 2022
05 | standard design (Part 2): how to standardize the different styles of commit information, which are difficult to read?
idea 热启动失效解决方案
冲刺强基计划数学物理专题二
Kubernetes visual interface dashboard
Hit the point! The largest model training collection!
接口测试框架实战(一) | Requests 与接口请求构造
Lambda expression