【ESP32学习之路3——构建系统与组件】

一、概念

相关内容参考乐鑫文档
①项目: 特指一个目录,其中包含了构建可执行应用程序所需的全部文件和配置,以及其他支持型文件,例如分区表、数据/文件系统分区和引导程序。

②项目配置: 保存在项目根目录下名为 sdkconfig 的文件中,可以通过 idf.py menuconfig 进行修改,且一个项目只能包含一个项目配置。

③应用程序: 是由 ESP-IDF 构建得到的可执行文件。一个项目通常会构建两个应用程序:项目应用程序(可执行的主文件,即用户自定义的固件)和引导程序(启动并初始化项目应用程序)。

④组件: 是模块化且独立的代码,会被编译成静态库(.a 文件)并链接到应用程序。部分组件由 ESP-IDF 官方提供,其他组件则来源于其它开源项目。

⑤目标: 特指运行构建后应用程序的硬件设备。ESP-IDF 当前仅支持 esp32 和 esp32s2 以及 esp32c3 这三个硬件目标。

请注意,以下内容并不属于项目的组成部分:

ESP-IDF 并不是项目的一部分,它独立于项目,通过 IDF_PATH 环境变量(保存 esp-idf 目录的路径)链接到项目,从而将 IDF 框架与项目分离。

交叉编译工具链并不是项目的组成部分,它应该被安装在系统 PATH 环境变量中。

二、新建工程

从esp-idf中复制出hello_world文件放在自己的的项目文件夹中。
在这里插入图片描述
我放在cmake_example文件夹下,可以直接修改工程名称hello_world文件夹名自定义为my_project
在这里插入图片描述
也可以修改hello_world_main.c重命名为user_main.c
在这里插入图片描述
同时要在main/cmakelists里修改hello_world_main.c为user_main.c
在这里插入图片描述
在顶层CMakeLists.txt文件中修改项目名称为my_project,该名称会作为最终输出的二进制文件的名字.
在这里插入图片描述

三、项目分析

可以看出hello_world工程(现在为my_project)的项目结构为

- myproject/
             - build/
             - main/       - CMakeLists.txt
                           - user_main.c
             - CMakeLists.txt
             - sdkconfig

①“build” 目录是存放构建输出的地方,如果没有此目录,idf.py 会自动创建。CMake 会配置项目,并在此目录下生成临时的构建文件。随后,在主构建进程的运行期间,该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。此目录通常不会添加到项目的源码管理系统中,也不会随项目源码一同发布。
②“main” 目录是一个特殊的组件,它包含项目本身的源代码。”main” 是默认名称,CMake 变量 COMPONENT_DIRS 默认包含此组件,但您可以修改此变量。
③main中的cmakelists文件 每个组件目录都包含一个 CMakeLists.txt 文件,里面会定义一些变量以控制该组件的构建过程,以及其与整个项目的集成。
④顶层项目 CMakeLists.txt 文件,这是 CMake 用于学习如何构建项目的主要文件,可以在这个文件中设置项目全局的 CMake 变量。顶层项目 CMakeLists.txt 文件会导入 /tools/cmake/project.cmake 文件,由它负责实现构建系统的其余部分。该文件最后会设置项目的名称,并定义该项目。
⑤“sdkconfig” 项目配置文件,执行 idf.py menuconfig 时会创建或更新此文件,文件中保存了项目中所有组件(包括 ESP-IDF 本身)的配置信息。 sdkconfig 文件可能会也可能不会被添加到项目的源码管理系统中。

四、新建组件

可选的 “components” 目录中包含了项目的部分自定义组件,并不是每个项目都需要这种自定义组件,但它有助于构建可复用的代码或者导入第三方(不属于 ESP-IDF)的组件。或者,您也可以在顶层 CMakeLists.txt 中设置 EXTRA_COMPONENT_DIRS 变量以查找其他指定位置处的组件。
在这里插入图片描述
在my_project工程中新建components目录,再新建printf_hello_world组件,将main函数中第一句printf(“Hello world!\n”);作为函数放在hello_world.c中
在这里插入图片描述
在include头文件中暴露出来,在main中调用此函数打印hello_world
在这里插入图片描述
组件cmakelists.txt中包含源文件和头文件
在这里插入图片描述

五、组件 CMakeLists 文件

每个项目都包含一个或多个组件,这些组件可以是 ESP-IDF 的一部分,可以是项目自身组件目录的一部分,也可以从自定义组件目录添加。

最小组件 CMakeLists 文件如下:

最小组件 CMakeLists.txt 文件通过使用 idf_component_register 将组件添加到构建系统中。
idf_component_register(SRCS “foo.c” “bar.c”
INCLUDE_DIRS “include” REQUIRES mbedtls)
SRCS 是源文件列表(.c、.cpp、.cc、.S),里面所有的源文件都将会编译进组件库中。
INCLUDE_DIRS 是目录列表,里面的路径会被添加到所有需要该组件的组件(包括 main 组件)全局 include 搜索路径中。
REQUIRES 实际上并不是必需的,但通常需要它来声明该组件需要使用哪些其它组件。
上述命令会构建生成与组件同名的库,并最终被链接到应用程序中。
上述目录通常设置为相对于 CMakeLists.txt 文件的相对路径,当然也可以设置为绝对路径。

六、项目CMakeLists 文件

在main函数中包含hello_world.h头文件调用printf_hello_world();函数
在这里插入图片描述
看到串口打印出Hello world!即构建成功
在这里插入图片描述
每个项目都有一个顶层 CMakeLists.txt 文件,包含整个项目的构建设置。默认情况下,项目 CMakeLists 文件会非常小。

最小 CMakeLists 文件示例:

cmake_minimum_required(VERSION 3.5)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(myProject)

每个项目都要按照上面显示的顺序添加上述三行代码:
cmake_minimum_required(VERSION 3.5) 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.5 或更高的版本。
include($ENV{IDF_PATH}/tools/cmake/project.cmake) 会导入 CMake 的其余功能来完成配置项目、检索组件等任务。
project(myProject) 会创建项目本身,并指定项目名称。该名称会作为最终输出的二进制文件的名字,即 myProject.elf 和 myProject.bin。每个 CMakeLists 文件只能定义一个项目。

可选的项目变量(如EXTRA_COMPONENT_DIRS)请使用 cmake 中的 set 命令 来设置这些变量,如 set(VARIABLE “VALUE”)。请注意,set() 命令需放在 include(…) 之前,cmake_minimum(…) 之后。

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值