はじめに
FlutterではDartのFFIを使用することでC APIを公開している既存のネイティブライブラリを使用することができます。1
そのため、Flutterプラグイン開発でC/C++を使用する場面が出てくることが予想されます。
ぼくはC/C++開発においてVSCodeのclangd拡張を使用しており、Flutterプラグイン開発でclangdの設定に手こずったので設定方法を残します。
前提条件
- OS: Ubuntu20.04
- Flutter: 3.24.1
- Linux向けのFlutterプラグイン開発を行っている
- エディタ: VSCode
- clangd拡張をインストール済みであること
手順
1. compile_commands.json
を作成する
Flutterプラグインのディレクトリ構成は以下のようになっているはずです。(https://codelabs.developers.google.com/codelabs/flutter-ffigen?hl=ja#2 より)
<開発中のFlutterプラグイン名>
├── CHANGELOG.md
├── LICENSE
├── README.md
├── analysis_options.yaml
├── android
│ ├── build.gradle
│ ├── ffigen_app_android.iml
│ ├── local.properties
│ ├── settings.gradle
│ └── src
├── example
│ ├── README.md
│ ├── analysis_options.yaml
│ ├── android
│ ├── ffigen_app_example.iml
│ ├── ios
│ ├── lib
│ ├── linux
│ ├── macos
│ ├── pubspec.lock
│ ├── pubspec.yaml
│ └── windows
├── ffigen.yaml
├── ffigen_app.iml
├── ios
│ ├── Classes
│ └── ffigen_app.podspec
├── lib
│ ├── ffigen_app.dart
│ └── ffigen_app_bindings_generated.dart
├── linux
│ └── CMakeLists.txt
├── macos
│ ├── Classes
│ └── ffigen_app.podspec
├── pubspec.lock
├── pubspec.yaml
├── src
│ ├── CMakeLists.txt
│ ├── ffigen_app.c
│ └── ffigen_app.h
└── windows
└── CMakeLists.txt
このうち<開発中のFlutterプラグイン名>/example
に移動し、以下のコマンドを実行してビルドを行います。
flutter run
そうすると以下のようビルドに失敗した旨のエラーが出ますが一旦無視します。
Error: Build process failed
その後<開発中のFlutterプラグイン名>/example/linux
に移動し以下のコマンドを実行しcompile_commands.json
を生成します。(参考)
mkdir build && cd build
cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 ..
2. clangd拡張の設定をする
VSCodeのclangd拡張から「拡張機能の設定」メニューに進み、ワークスペースタブを選択したあと「Clangd: Arguments」で以下の項目を追加します。
--compile-commands-dir=${workspaceFolder}/example/linux/build
上記の項目を追加後、ウィンドウをリロードするとclangd拡張が使えるようになります。