esp32学习笔记-1 cmake的使用

esp-idf使用cmake完成工程构建,故先学习cmake的使用

1.cmake基本知识

#约束cmake最低版本

cmake_minimum_required(VERSION 3.10)

#设置工程名称

project(projectName)

#单文件时直接编译即可

add_executable(可执行文件名称 源文件)

eg:

add_executable(main main.cpp)

#很多源文件,使用aux_source_directory函数

aux_source_directory(源文件地址 变量)

eg:

aux_source_directory(./source SCR_LIST)

add_executable(main ${SCR_LIST})

#头文件不在一个文件夹

include_directories(头文件文件夹地址)

eg:

include_directories(./include)

aux_source_directory(./source1 SRC_LIST2)

add_executable(hello ${SRC_LIST2})

内置变量${PROJECT_BINARY_DIR}表明执行cmake的目录

2.esp-idf构建系统

首先esp-idf构建系统的CMakeLists.txt分为两类,一类是项目CMakeList文件,处于项目顶层,一类是组件CMakeList文件。以初始的hello_world项目为例。

项目目录结构

首先是顶层CMakeLists.txt文件,也是最小项目CMakeLists.txt文件

cmake_minimum_required(VERSION 3.16)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(hello_world)

这里引用官方文档的解释

  • cmake_minimum_required(VERSION 3.16) 必须放在 CMakeLists.txt 文件的第一行,它会告诉 CMake 构建该项目所需要的最小版本号。ESP-IDF 支持 CMake 3.16 或更高的版本。

  • include($ENV{IDF_PATH}/tools/cmake/project.cmake) 会导入 CMake 的其余功能来完成配置项目、检索组件等任务。

  • project(myProject) 会创建项目本身,并指定项目名称。该名称会作为最终输出的二进制文件的名字,即 myProject.elf 和 myProject.bin。每个 CMakeLists 文件只能定义一个项目

其次是组件CMakeLists.txt文件,也是最小组件CMakeLists.txt文件

idf_component_register(SRCS "hello_world_main.c"
                    INCLUDE_DIRS "")

  • 使用idf_component_register将组件添加到构建系统。
  • SRCS 源文件列表
  • INCLUDE_DIRS 头文件目录,hello_world例程中没有其他头文件,故为空。
  • 其次可能还有REQUIRES 说明组件依赖。

学习验证

手动构建目录以及填写相关CMakeLists.txt文件,使用esp-idf进行构建

如图构建如下目录工程

add.h

int add(int a,int b);

add.c

#include "add.h"

int add(int a, int b) {
    return a + b;
}

add组件的CMakeLists.txt

idf_component_register(SRCS "add.c"
                       INCLUDE_DIRS "./include")

main.c

#include <stdio.h>
#include "add.h"

void app_main(void){
    printf("%d%s",add(3,5),"Hello World!");
}

main组件的CMakeLists.txt

idf_component_register(SRCS "main.c"
INCLUDE_DIRS "")

根据官方文档的说法:main 组件比较特别,因为它在构建过程中自动依赖所有其他组件。所以不需要向这个组件传递 REQUIRES 或 PRIV_REQUIRES。所以尽管main组件依赖add组件,但还是没有添加进REQUIRES。

项目顶层CMakeLists.txt

cmake_minimum_required(VERSION 3.10)
include($ENV{IDF_PATH}/tools/cmake/project.cmake)
project(project_by_hand)

 编译烧录代码,并通过串口查看结果。看自己连接的是哪个端口,不一定是COM16。

idf.py set-target esp32s3
idf.py build
idf.py -p COM16 flash
idf,py -p COM16 monitor

 实验成功!

12.15补充

官方文档中关于通用组件依赖的描述:

通用组件依赖项

为避免重复性工作,各组件都用自动依赖一些“通用”IDF 组件,即使它们没有被明确提及。这些组件的头文件会一直包含在构建系统中。

通用组件包括:cxx、newlib、freertos、esp_hw_support、heap、log、soc、hal、esp_rom、esp_common、esp_system。

### ESP-IDF CMake 使用指南 #### 配置与使用方法概述 对于ESP-IDF版本4.x及以上,Espressif提供了基于Eclipse CDT构建的IDE插件——idf-eclipse-plugin,支持CMake项目的创建、编译和调试功能[^1]。 #### 创建新项目 当利用CMake来管理ESP-IDF工程时,开发者可以轻松地通过命令行工具`idfgenerate.py`生成适用于不同集成开发环境(IDE)的工作区文件。然而,在大多数情况下,直接编辑根目录下的`CMakeLists.txt`更为常见也更加灵活。此文件定义了整个项目的结构以及各个源码模块之间的依赖关系。 ```cmake # CMake最低版本需求声明 cmake_minimum_required(VERSION 3.5) # 设置默认路径分隔符为Unix风格 set(CMAKE_EXPORT_COMPILE_COMMANDS ON) include($ENV{IDF_PATH}/tools/cmake/project.cmake) project(hello_world) ``` 上述脚本片段展示了最基础的一个`CMakeLists.txt`模板,其中包含了指定所需的最小化CMake版本号,并导入官方提供的辅助宏指令集以便简化后续操作流程。 #### 添加组件 为了使自定义库成为可被其他部分引用的标准组成部分之一,则需按照特定格式编写对应的描述文档并放置于相应位置下: - 组件应位于独立子文件夹内; - 子文件夹名称即代表该组件的名字; - 文件夹内部必须存在名为`CMakeLists.txt`的配置清单用于说明其属性特征; 下面是一个典型的例子,假设有一个叫做`mylib`的外部静态链接库希望加入到当前解决方案之中: ```plaintext ├── components/ │ └── mylib/ │ ├── include/ │ │ └── mylib.h │ ├── src/ │ │ └── mylib.c │ └── CMakeLists.txt └── main/ └── ... ``` 对应`components/mylib/CMakeLists.txt`的内容如下所示: ```cmake idf_component_register(SRCS "src/mylib.c" INCLUDE_DIRS "include") ``` 这段代码的作用在于向系统注册一个新的可用部件,并指定了它所包含的具体实现单元(`SRCS`)及其头文件所在的位置(`INCLUDE_DIRS`)。 #### 构建过程 完成以上准备工作后,只需执行标准的CMake构建序列即可顺利完成整个应用程序镜像的制作: ```bash mkdir build cd build cmake .. make -j$(nproc) ``` 这里先建立了一个临时输出空间(build),接着调用了两次不同的程序:首先是`cmake ..`负责解析顶层控制语句并将之转换为目标平台特有的中间表示形式;其次是`make ...`真正启动多线程汇编/编译引擎以产出最终产物。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值