我这段时间尝试在微雪的 ESP-32 One 上面使用 PlatformIO (下称PIO)开发程序,但是在查找官方资料的时候,碰见了一些问题:
- 乐鑫有自己专门的音频开发框架 ESP-ADF,这不仅仅是一堆源文件,ESP-ADF 独立且可以包含或者引用 ESP-IDF,无法与 PIO 联动或者使用 PIO 管理。
- PIO 目前没有对 ESP-ADF 的官方支持。
- ESP-ADF 默认只支持有限的官方开发板。
- 微雪的官方文档几乎没有提到 ESP-ADF……
有没有一种方法,在使用 PIO 的同时,又使用来自 ESP-ADF 的部分库呢?

研究一下代码,我发现,乐鑫方面使用 CMake 管理开发环境,ESP-ADF 根目录下的文件里有这么一行:
set(EXTRA_COMPONENT_DIRS $ENV{ADF_PATH}/components)
同时,被引用的 ESP-SR (单独的语音识别库)也提及:
These algorithms are provided in the form of a component
虽然乐鑫没有详细解释过 component 到底是什么贵物,但可以合理猜测这就是乐鑫互相引用代码库的方式。(略微吐槽一下:EXTRA_COMPONENT_DIRS
显然不是 CMake 官方的配置,但乐鑫却默认用户早就应该熟悉 CMake 并知道他们在 IDF 的 CMake 里整了什么妖蛾子……)
所以接下来就很简单。
(再次吐槽:微雪官方教程里用了 ESP-WHO 的官方的旧版示例 ,本来是给ESP-EYE板子用的……况且官方在新版里删除了这个例程)
用 PlatformIO 新建一个项目。板子选 esp32cam
( 反正带摄像头,应该差不多),框架选 ESP-IDF。
打开新建的项目文件夹,编辑 CMakeList.txt
,添加:
set(EXTRA_COMPONENTS_DIRS components/)
然后将 ESP-SR 下载到 components
文件夹里。

这个时候运行 PIO 菜单的 Run Menuconfig,应该可以看到音频识别相关配置了。
现在可以编译音频识别相关项目,但有可能失败,因为 ESP-SR 的 CMake 配置里有多余的 "-Wl,--start-group"
标志传递给了链接器,到时候有链接失败可能。

类似上图,到 components/esp-sr/CMakeLists.txt
删除这些条目即可。