在第一篇的基础上,经过一段时间的学习,看其他人的视频。
ESPIDF的CMAKE其实还有这个特性:
主目录下的CMAKElists文件中,箭头的这句include其实就是帮我们包含了idf目录下的cmake文件,包含了有什么用呢?
其实包含了idf目录下的cmakelists文件,间接上就等于包含了idf目录下的components文件夹内的所有组件,这就是为什么main.c可以直接include一些默认组件。
比如:
freertos这个组件就是idf内官方提供的,如果根目录的cmakelists里面没有那句include,那么main.c是无法直接包含freertos这个组件的。
搞明白了根目录下的cmakelists之后,我们知道项目文件夹内的components是cmake帮我们包含的idf目录下的官方组件,如果我们想要新增自己的组件user_components,那么直接把自己想要添加的组件写在components文件夹内,main文件也能调用到。
如果想要目录更加清爽和规范,按照我个人的编程习惯,我会再新建一个user_components文件夹,用于存放我自己编写的用户组件,并在user_components文件夹内新建了三个自己写的组件,用于存放各模块的功能函数,我将这个文件夹新建在根目录下:
如果想要在main.c中使用user_system.c里面的函数怎么办呢,按照51的习惯就是先把user_system.h的路径添加到keil的工程目录下,在ESP32中怎么操作呢?
在根目录的cmakelists中添加:
意思就是添加一个额外的组件目录,即根目录下 “User_components” 这个文件夹 ,至于这个文件夹里面还有二级目录,这个没关系,cmake可以正常找到里面的各个组件的cmakelists。在user_components这个文件夹内有多少个组件,那么就会被包含多少个组件进来工程中,这样就完成了添加多个组件的操作。
在设置额外组件目录的操作中,还可以把组件目录放在其他位置,通过声明组件目录的路径,cmake也能去到相关的目录找出用户编写的组件。
在用户组件这个文件夹内,自己编写的 如组件 system 这个组件的文件夹内,还需要编写这个组件自己的cmakelists,作用就是告诉cmake这个组件内有哪些.h 有哪些 .c 有哪些依赖。写法如下:
idf_component_register( SRCS "user_system.c"
INCLUDE_DIRS "."
REQUIRES driver)
意思就是:这个组件的.c文件是:user_system.c,需要包含的.h文件是:当前目录下的所有.h后缀的文件,依赖是:driver (ESP-IDF目录components/driver)这个组件。
依赖:意思就是需要告诉cmake 用户写的这个组件 与 被这个组件调用到的其他组件 的依赖关系(谁调用谁),假设user_system.c需要用到user_timer.c中的函数,那么这个requires还需要加多一个依赖关系,变为:
idf_component_register( SRCS "user_system.c"
INCLUDE_DIRS "."
REQUIRES driver
timer)
基本到这,cmake的简单用法好像已经写完了,项目过程需要用到的新增.c和.h,好像已经实现,下一篇开始点灯吧。