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を全て書いた例はこんな↓感じ。
なお、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の機能はほぼ使えないようだ。
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
toolchain-xtensa32に関しては、以下のページから最新版(と思われる)を指定した。GCC 8.4がインストールされる。
また、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の記述を修正。
参考
-
%HOMEPATH%\.platformio\packages\framework-arduinoespressif32\tools\sdk\include\config\sdkconfig.h
の最後あたりの記述から分かる↩