ESP32-添加多目录的自定义组件

前言

在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个子目录具体关系如下:
![在这里插入图片描述](https://img-blog.csdnimg.cn/fa38defea2d04130bb11ed56ecacffbc.png在这里插入图片描述

模块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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值