われがわログ

最適化アルゴリズムとかプログラミングについて書きたい

PlatformIO + ESP32をC++14 (or C++17)に対応させる

※21/04/17現在の情報です。

M5Paperを開発していたところ、ちゃんと設定しないとC++14以上の機能が使えなかったのでメモ。

PlatformIO + ESP32環境をC++14に対応させるには、platformio.iniに以下を設定すればよい。

build_flags = 
  -std=gnu++14
build_unflags =
  -std=gnu++11

M5Paper向けにiniを全て書いた例はこんな↓感じ。

github.com

なお、2021/1/7現在、PlatformIOでESP32を指定した際にインストールされるGCCのバージョンは5.2であり、%HOMEPATH%\.platformio\packages\toolchain-xtensa32\bin\xtensa-esp32-elf-g++.exeにインストールされている。また、-std=gnu++14でなく-std=gnu++17と指定してもよいが、 以下のコンパイラ実装状況ページによれば、GCC5.2ではC++17の機能はほぼ使えないようだ。

cpprefjp.github.io

C++17を使いたい場合には、toolchain等を最新版に更新する必要がある。具体的には、Windowsで開発する場合、以下のようにplatformio.ini を設定する。

platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-upstream
platform_packages =
    framework-arduinoespressif32 @ https://github.com/espressif/arduino-esp32.git
build_flags =
    -std=gnu++17
build_unflags =
    -std=gnu++11

github.com

toolchain-xtensa32に関しては、以下のページから最新版(と思われる)を指定した。GCC 8.4がインストールされる。

platform-espressif32/platform.json at feature/arduino-idf-v4.2 · platformio/platform-espressif32 · GitHub

また、framework-arduinoespressif32に関しては、ESP-IDFに最も追従していると思われるidf-release/v4.2ブランチを指定している。

上記のm5paper-dashboardリポジトリC++17設定を試してみたところ、LovyanGFXライブラリでいくつかのコンパイルエラーが出た。足りないヘッダファイルをincludeするだけでコンパイルは通るようになったが、FastLEDライブラリで多数の警告が出たりと、安定はしていないようだ。

ちなみに、framework-arduinoespressif32をバージョン指定なしでいれると、ESP-IDF v3.2がインストールされる1。最新版はESP-IDF v4.2であるから、かなり古いバージョンだ。 サポートも2020/10に切れている。

追記

LovyanGFX、FastLEDでのコンパイルエラー、警告に関してはプルリクを出し、無事マージされた。

追記2

21/3/1現在、platform.iniでflashパーティションを明示的に設定しないとflashの容量が正しく反映されない。

board_build.partitions = default_16MB.csv

210218追記

toolchain-xtensa32の設定を修正。bintray閉鎖の影響?

210330追記

toolchain-xtensa32, framework-arduinoespressif32のバージョンを指定するのでなく

platform = https://github.com/platformio/platform-espressif32.git#feature/arduino-idf-v4.2

としてプロットフォームのブランチを指定するだけでいけそう。ただし、platform-espressif32のdevelopブランチよりコミットが遅れてるかも。

210417追記

framework-arduinoespressif32のgitのアドレスを変更し、idf-release/v4.2ブランチ指定を消した。 同ブランチが削除されたため。

210821_追記

platformio.iniの記述を修正。

参考

community.platformio.org


  1. %HOMEPATH%\.platformio\packages\framework-arduinoespressif32\tools\sdk\include\config\sdkconfig.h の最後あたりの記述から分かる