<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>ESP32 on RinChord的小本本</title>
        <link>https://blog.rinchord.top/tags/esp32/</link>
        <description>Recent content in ESP32 on RinChord的小本本</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Wed, 18 Feb 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.rinchord.top/tags/esp32/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>ESP-IDF项目风格</title>
        <link>https://blog.rinchord.top/p/esp-idf%E9%A1%B9%E7%9B%AE%E9%A3%8E%E6%A0%BC/</link>
        <pubDate>Wed, 18 Feb 2026 00:00:00 +0000</pubDate>
        
        <guid>https://blog.rinchord.top/p/esp-idf%E9%A1%B9%E7%9B%AE%E9%A3%8E%E6%A0%BC/</guid>
        <description>


  &lt;blockquote&gt;
    &lt;p&gt;参考文档&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html&lt;/a&gt;&lt;/p&gt;

  &lt;/blockquote&gt;

&lt;h1 id=&#34;项目架构与风格&#34;&gt;项目架构与风格
&lt;/h1&gt;&lt;h2 id=&#34;基本概念&#34;&gt;基本概念
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;项目&lt;/strong&gt;&lt;br&gt;
特指一个目录，其中包含了构建 &lt;strong&gt;应用程序&lt;/strong&gt; （即可执行文件）所需的全部文件和配置，还包含了其他支持型文件，&lt;br&gt;
例如分区表、数据分区或文件系统分区，以及引导加载程序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目配置&lt;/strong&gt;&lt;br&gt;
保存在项目根目录下名为 &lt;code&gt;sdkconfig&lt;/code&gt; 的文件中，&lt;br&gt;
可以通过 &lt;code&gt;idf.py menuconfig&lt;/code&gt; 进行修改，且一个项目只能包含一个项目配置。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;应用程序&lt;/strong&gt;&lt;br&gt;
是由 &lt;code&gt;ESP-IDF&lt;/code&gt; 构建得到的可执行文件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个项目通常会构建两个应用程序：
&lt;ul&gt;
&lt;li&gt;项目应用程序（可执行的主文件，即用户自定义的固件）&lt;/li&gt;
&lt;li&gt;引导加载程序（启动并初始化项目应用程序）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;组件&lt;/strong&gt;&lt;br&gt;
组件是 &lt;code&gt;COMPONENT_DIRS&lt;/code&gt; 列表中包含 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 文件的任何目录。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;组件将会被编译成静态库（.a 文件）并链接到应用程序。&lt;/li&gt;
&lt;li&gt;部分组件由 &lt;code&gt;ESP-IDF&lt;/code&gt; 官方提供，其他组件则来源于其它开源项目。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;&lt;br&gt;
特指运行构建后应用程序的硬件设备。&lt;br&gt;
运行 &lt;code&gt;idf.py --list-targets&lt;/code&gt; 可以查看当前 &lt;code&gt;ESP-IDF&lt;/code&gt; 版本中支持目标的完整列表。&lt;/p&gt;
&lt;h2 id=&#34;项目基本结构&#34;&gt;项目基本结构
&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;main/&lt;/strong&gt;&lt;br&gt;
它是一种特殊的&lt;strong&gt;组件&lt;/strong&gt;，main组件内包含项目的入口文件&lt;br&gt;
在项目的入口文件中定义了&lt;code&gt;app_main()&lt;/code&gt;作为程序的入口函数&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;build/&lt;/strong&gt;&lt;br&gt;
存放构建输出的目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;CMake 会配置项目，并在此目录下生成临时的构建文件。&lt;/li&gt;
&lt;li&gt;随后，在主构建进程的运行期间，该目录还会保存临时目标文件、库文件以及最终输出的二进制文件。&lt;/li&gt;
&lt;li&gt;此目录通常不会添加到项目的源码管理系统中，也不会随项目源码一同发布。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;sdkconfig&lt;/strong&gt;&lt;br&gt;
执行 &lt;code&gt;idf.py menuconfig&lt;/code&gt; 时会创建或更新此文件，文件中保存了项目中所有组件（包括 ESP-IDF 本身）的配置信息。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sdkconfig.old&lt;/code&gt; 文件是前者的备份&lt;/li&gt;
&lt;li&gt;本文件存储了IDF Menu Config的配置项&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;component/&lt;/strong&gt;&lt;br&gt;
可选目录，包含了项目的部分自定义组件，可以在顶层CMakeLists.txt中设置 &lt;code&gt;EXTRA_COMPONENT_DIRS&lt;/code&gt; 变量来手动查找其他位置的组件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;该目录包含构成项目的标准组件，各个组件之间应低耦合，最终在main的入口文件中调用并实现任务创建等基本行为&lt;/li&gt;
&lt;li&gt;有助于构造可复用的代码或导入第三方组件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;managed_components/&lt;/strong&gt;&lt;br&gt;
由 IDF 组件管理器创建，用于存储由 IDF 组件管理器管理的组件&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;请勿手动修改 &amp;ldquo;&lt;code&gt;managed_components&lt;/code&gt;&amp;rdquo; 目录下的内容。如果需要进行更改，可以将组件复制到 &lt;code&gt;components&lt;/code&gt; 目录下。&lt;/li&gt;
&lt;li&gt;&amp;ldquo;&lt;code&gt;managed_components&lt;/code&gt;&amp;rdquo; 目录通常不在 Git 中进行版本控制，也不会与项目源代码一起分发。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;CMakeLists.txt&lt;/strong&gt;&lt;br&gt;
组织IDF项目的核心文件&lt;/p&gt;
&lt;h3 id=&#34;cmake文件结构&#34;&gt;CMake文件结构
&lt;/h3&gt;&lt;h4 id=&#34;顶层cmakelist&#34;&gt;顶层CMakeList
&lt;/h4&gt;&lt;p&gt;每个项目都有一个顶层 CMakeLists.txt 文件，包含整个项目的构建设置。默认情况下，项目 CMakeLists 文件会非常小。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;最小项目示例&lt;/strong&gt;:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cmake_minimum_required&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;VERSION&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;3.16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;   &lt;span class=&#34;c&#34;&gt;# 选择该项目使用的最低CMake版本
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$ENV{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/tools/cmake/project.cmake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# IDF的标准模板，会导入 CMake 的其余功能来完成配置项目、检索组件等任务
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;myProject&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c&#34;&gt;# 会创建项目本身，并指定项目名称。该名称会作为最终输出的二进制文件的名字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;可选项目变量&lt;/strong&gt;&lt;br&gt;
参考文档:  &lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-idf/blob/v5.5.1/tools/cmake/project.cmake&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/espressif/esp-idf/blob/v5.5.1/tools/cmake/project.cmake&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-gdscript3&#34; data-lang=&#34;gdscript3&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：组件的搜索目录，默认为&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;PROJECT_DIR&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;components&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;、和&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;。如果你不想在这些位置搜索组件，请覆盖此变量。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用于搜索组件的其它可选目录列表。路径可以是相对于项目目录的相对路径，也可以是绝对路径。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：用于指定要构建到项目中的组件名称列表，默认为&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENT_DIRS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;目录下检索到的所有组件。使用此变量可以“精简”项目，从而缩短构建时间。请注意，如果一个组件通过&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENT_REQUIRES&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;指定了它依赖的另一个组件，则会自动将其添加到&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;中，所以&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;列表可能会非常短。另外，还可以通过设置&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;MINIMAL_BUILD&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;构建属性&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;来指定&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;COMPONENTS&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;中的&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;main&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;组件。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BOOTLOADER_IGNORE_EXTRA_COMPONENT&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：可选组件列表，位于&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;bootloader_components&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;err&#34;&gt;目录中，引导加载程序编译时会忽略该列表中的组件。使用这一变量可以将一个组件有条件地包含在项目中。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;BOOTLOADER_EXTRA_COMPONENT_DIRS&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;：可选的附加路径列表，引导加载程序编译时将从这些路径中搜索要编译的组件。注意，这是一个构建属性。&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&#34;组件cmakelist&#34;&gt;组件CMakeList
&lt;/h4&gt;&lt;p&gt;这个文件用来在IDF中注册组件自身的相关源代码,以便于后续与项目其他部分进行链接.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;esp-idf的外部组件注册行为发生在该外部组件的根目录cmakelist文件中&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;当 CMake 运行项目配置时，它会记录本次构建包含的组件列表，它可用于调试某些组件的添加/排除&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果组件存在重名,IDF搜索组件的优先级:
&lt;ul&gt;
&lt;li&gt;项目目录下的组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXTRA_COMPONENT_DIRS&lt;/code&gt; 中的组件&lt;/li&gt;
&lt;li&gt;项目目录下 &lt;code&gt;managed_components/&lt;/code&gt; 目录中的组件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;IDF_PATH/components&lt;/code&gt; 目录下的组件&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将ESP-IDF组件复制到项目目录下,就可以在不修改IDF源代码的前提下修改IDF的内部组件&lt;/li&gt;
&lt;li&gt;需要fullclean后重新构建项目才能看到新组件的路径&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;创建一个新组件后,可以使用IDF的内置函数将其快速添加到构建系统中.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;idf_component_register&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s&#34;&gt;SRCS&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;foo.c&amp;#34;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;bar.c&amp;#34;&lt;/span&gt;    &lt;span class=&#34;c&#34;&gt;# 该组件中需要加入构建系统的源代码文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;INCLUDE_DIRS&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;include&amp;#34;&lt;/span&gt;  &lt;span class=&#34;c&#34;&gt;# 添加头文件到全局include搜索路径中
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;    &lt;span class=&#34;s&#34;&gt;REQUIRES&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;mbedtls&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;       &lt;span class=&#34;c&#34;&gt;# 添加组件前置依赖关系, 声明该组件需要使用什么其他组件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;这个函数将会生成一个与根目录文件夹名称一致的库,并在最终链接至应用程序中&lt;/li&gt;
&lt;li&gt;使用相对路径&lt;/li&gt;
&lt;li&gt;支持一些额外的参数,参考这里&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html#cmake-component-register&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/build-system.html#cmake-component-register&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;组件变量参考&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-fallback&#34; data-lang=&#34;fallback&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_DIR：组件目录，即包含 CMakeLists.txt 文件的绝对路径，它与 CMAKE_CURRENT_SOURCE_DIR 变量一样，路径中不能包含空格。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_NAME：组件名，与组件目录名相同。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_ALIAS：库别名，由构建系统在内部为组件创建。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_LIB：库名，由构建系统在内部为组件创建。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;COMPONENT_VERSION：组件版本，由 idf_component.yml 指定并由 IDF 组件管理器设置。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;可以把KConfig添加到与CMakelist.txt同级的组件根目录中,就可以为该组件添加一些独有配置了.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;组件依赖&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;main组件默认依赖所有组件,无需传递&lt;code&gt;REQUIRES&lt;/code&gt; 或 &lt;code&gt;PRIV_REQUIRES&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;即便不声明 &lt;code&gt;REQUIRES&lt;/code&gt; 或 &lt;code&gt;PRIV_REQUIRES&lt;/code&gt;, 各组件也会默认依赖一些基础组件&lt;br&gt;
通用组件包括：cxx、newlib、freertos、esp_hw_support、heap、log、soc、hal、esp_rom、esp_common、esp_system。&lt;/li&gt;
&lt;li&gt;如果将 &lt;code&gt;COMPONENTS&lt;/code&gt; 变量设置为项目直接使用的最小组件列表，那么构建系统会扩展到包含所有组件。完整的组件列表为：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;COMPONENTS&lt;/code&gt; 中明确提及的组件。&lt;/li&gt;
&lt;li&gt;这些组件的依赖项（以及递归运算后的组件）。每个组件都依赖的 通用组件。&lt;/li&gt;
&lt;li&gt;会显著缩短构建时间&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;添加自定义bootloader&#34;&gt;添加自定义Bootloader
&lt;/h3&gt;&lt;p&gt;// TODO&lt;/p&gt;
&lt;h2 id=&#34;不使用idf标准cmake函数添加外部组件&#34;&gt;不使用IDF标准CMake函数添加外部组件
&lt;/h2&gt;&lt;p&gt;// TODO&lt;/p&gt;
&lt;h2 id=&#34;编写多目标&#34;&gt;编写多目标
&lt;/h2&gt;


  &lt;blockquote class=&#34;alert alert-warning&#34;&gt;
    &lt;p class=&#34;alert-heading&#34;&gt;
      ℹ️
      
        Warning
      
    &lt;/p&gt;
    &lt;p&gt;猜你在找:esp-idf 测试&lt;/p&gt;
&lt;p&gt;&lt;a class=&#34;link&#34; href=&#34;https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.3/esp32/api-guides/build-system.html#cmake-buildsystem-api&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://docs.espressif.com/projects/esp-idf/zh_CN/release-v5.3/esp32/api-guides/build-system.html#cmake-buildsystem-api&lt;/a&gt;&lt;br&gt;
&lt;a class=&#34;link&#34; href=&#34;https://github.com/espressif/esp-idf/tree/7024ea10/examples/build_system/cmake/idf_as_lib&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;https://github.com/espressif/esp-idf/tree/7024ea10/examples/build_system/cmake/idf_as_lib&lt;/a&gt;&lt;br&gt;
需要注意,似乎IDF从6.0版本才支持自定义多主目标&lt;br&gt;
我使用的SDK版本是5.3,所以需要使用CMake来手动配置多目标。&lt;/p&gt;
  &lt;/blockquote&gt;

&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-CMake&#34; data-lang=&#34;CMake&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cmake_minimum_required&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;VERSION&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;3.16&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;project&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;my_custom_app&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;C&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 导入提供 ESP-IDF CMake 构建系统 API 的 CMake 文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;include&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;$ENV{&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;IDF_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/tools/cmake/idf.cmake&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 在构建中导入 ESP-IDF 组件，可以视作等同 add_subdirectory()
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 但为 ESP-IDF 构建增加额外的构建过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 具体构建过程
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;idf_build_process&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;esp32&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 创建项目可执行文件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;# 使用其别名 idf::newlib 将其链接到 newlib 组件
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;add_executable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;main.c&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;target_link_libraries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt; &lt;span class=&#34;s&#34;&gt;idf::newlib&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;&lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 让构建系统知道项目到可执行文件是什么，从而添加更多的目标以及依赖关系等
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;idf_build_executable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;${&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;CMAKE_PROJECT_NAME&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;.elf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
        </item>
        
    </channel>
</rss>
