ESP32 BLEプログラミングの落とし穴: 'esp_ble_adv_data_t' コンパイルエラーの解決法
#include <BLEDevice.h>
, #include <BLEServer.h>
を含むクラスを、別のクラスに参照渡しで追加した際に、PlatformIOで error: 'esp_ble_adv_data_t' does not name a type; did you mean 'esp_ble_adv_data_type'?
というコンパイルエラーが発生しました。 platform.ini ファイルに build_flags = -DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE
を追加することで、このエラーは解消されました。
エラーの発生原因が少しわかりづらかったので、内容についてまとめます。
解説
error: 'esp_ble_adv_data_t' does not name a type というエラーは、esp_ble_adv_data_t
という型がコンパイル時のコンテキストに存在しないことを示しています。esp_ble_adv_data_t は ESP32のBluetooth Low Energy (BLE) 関連の構造体で、広告データの定義に使用されます。
エラーの原因
このエラーの原因は2つ考えられます。
ヘッダーファイルの不足:
esp_ble_adv_data_t
が定義されているヘッダーファイルがインクルードされていないか、プロジェクトに適切に含まれていない可能性があります。
コンパイルフラグの欠如:
特定の機能や定義は、コンパイル時のフラグによって有効化されることがあります。この場合、-DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE
フラグが必要だった可能性があります。
build_flags による解決
build_flags = -DBLE_42_FEATURE_SUPPORT=TRUE -DBLE_50_FEATURE_SUPPORT=TRUE
の追加によってエラーが解消されたことは、これらのフラグがESP32のBLE関連の機能を有効化するために必要だったことを示唆しています。
BLE 4.2およびBLE 5.0のサポートを有効にすることで、esp_ble_adv_data_t
が含まれるヘッダーファイルや関連機能がコンパイル時に利用可能になった可能性があります。
結論
この種の問題は、プロジェクトの設定や依存関係の複雑さから生じることが多いです。特に、ESP32のような組み込みシステムでは、ハードウェア機能やSDKのバージョンによって、コンパイル時のフラグが重要な役割を果たすことがあります。この場合、適切なビルドフラグの追加により、必要な型定義や機能がコンパイル時に利用可能になり、問題が解決しました。
関連
BLE Advertising type are not defined in v4.4 · Issue #6388 · espressif/arduino-esp32
Discussion