Flutter: Include of non-modular header inside framework module 'FirebaseSessions.FIRSESNanoPBHelpers'のエラー
結論:「use_frameworks!」を削除、「use_modular_headers!」を「target 'Runner' do 」の外に書く
2023/5/1 Flutter エラー・バグ日記
ネット上の情報やChatGPTへの質問では解決できなかったが、たまたま自分で解決策に辿り着いたので、共有のために記録。
とあるパッケージをインポートして、Xcodeからビルドをしたところ、下記2つのエラーが発生。
- Include of non-modular header inside framework module 'FirebaseSessions.FIRSESNanoPBHelpers'
- Could not build Objective-C module 'FirebaseSessions'
いずれもFirebase関連のエラー。Androidでは発生せず、あくまでiOSのみで発生。
iOSビルドエラーの定番対応は効果なし
下記定番の対応をひと通り試したが、効果はなかった。
- flutter clean
- pubspec.lock削除 → flutter pub upgrade(パッケージ更新)
- Podfileの「platform :ios, 'XX'」の番号(XX部分)を上げる ※11.0→14.0にした
- Podfile.lock削除 →
pod install --repo-update
- pod update → sudo gem install cocoapods
- Xcodeで「Clean Build Folder」
Podfileの「use_frameworks!」あたりが怪しい
ググってみると、つい1ヶ月ほど前に、全く同じエラーの報告(Q&A記事)があった。
解決につながる回答はなされていないが(2023/5/1時点)、Podfile内の記述について、複数の回答があった。
1つ目の回答では、最新のFirebaseには「use_frameworks!」が必要だが、「use_modular_headers!」は不要(サポート対象外)、との趣旨が書かれている。
そこで、下記のとおり、Podfile内の「use_modular_headers!」のみを削除(コメントアウト)した。
# Uncomment this line to define a global platform for your project platform :ios, '14.0' ・・・(略)・・・ flutter_ios_podfile_setup target 'Runner' do use_frameworks! # use_modular_headers! ← これだけコメントアウト flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end ・・・(略)・・・
しかし、これでビルドしてもエラーは変わらなかった。
そもそも「use_frameworks!」と「use_modular_headers!」に対する理解が不足していることもあり、、ChatGPTに意見を聞いてみる。
すると、以下の方法を提案された。
- 「use_modular_headers!」の方は、コメントアウトせずそのままにし、
- 「use_frameworks!」の方を「
target 'Runner' do
」の外側に移動させる
提案の意味も尋ねてみると、下記の点を教えてくれた。
- 「use_frameworks!」は、CocoaPodsが依存関係をフレームワーク(.framework)として取り込むことを指示するもの ※この設定がない場合、CocoaPodsは代わりに静的ライブラリ(.a)として依存関係を取り込む
- Flutterプロジェクトでは、通常は「
target 'Runner' do
」 の中に「use_frameworks!」を配置するが、場合によっては、特定の依存関係や設定の問題を解決するために、全ターゲットに適用する必要がある
そこで、提案どおり下記のようにPodfileを修正してみた。
# Uncomment this line to define a global platform for your project platform :ios, '14.0' ・・・(略)・・・ flutter_ios_podfile_setup use_frameworks! # ← ここに移動 target 'Runner' do # use_frameworks! ← ここの記述はコメントアウト use_modular_headers! flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end ・・・(略)・・・
しかし、ビルドすると今度はもっと多くのエラー(具体的な記載は割愛)が発生してしまった。
ただ、解決はできなかったものの、「use_frameworks!」の意味や、「target 'Runner' do
」の中と外の違いを理解できたのは有益だった。
※ChatGPTからの情報は、必ずググって裏を取るよう心掛けているが、「use_frameworks!」関係の情報は、以前からネットで調べても明確な理解に至れず、、、いったんChatGPTの教えを信じさせていただく。
試行錯誤中に発生したエラーがヒントになり解決
その後も試行錯誤を続ける中で、ふと、Podfile中の「use_frameworks!」と「use_modular_headers!」の両方をコメントアウトしたらどうなるのだろう?と考え、やってみた。
※手探り過ぎるやり方でお恥ずかしい限りだが、、発想としては、前述のStack Overflowの回答(「use_modular_headers!」は不要)と、ChatGPTの提案(「target 'Runner' do
」の中に「use_frameworks!」は不要)を組み合わせたもの。
Podfileの修正後、iosフォルダ内で「pod install」する必要があるが、この「pod install」の段階で、以下のエラーが出た。
The Swift pod FirebaseCoreInternal
depends upon GoogleUtilities-00567490
, which does not define modules. To opt into those targets generating module maps (which is necessary to import them from Swift when building as static libraries), you may set use_modular_headers!
globally in your Podfile, or specify :modular_headers => true
for particular dependencies.
ここで、「use_modular_headers!」をPodfile内でグローバルに設定せよ、と書かれている点が目に留まった。
先ほど、ChatGPTに、
全ターゲットに適用させる場合は、「target 'Runner' do
」の外に書く
という事を教えてもらったので、「グローバルに設定」というのは、「target 'Runner' do
」の外に書くことを意味しているのではないか、と考えた。
そこで、下記のとおり、「use_frameworks!」はコメントアウトのままとし、「use_modular_headers!」の方を、「target 'Runner' do
」の外に移動させる形に変更した。
# Uncomment this line to define a global platform for your project platform :ios, '14.0' ・・・(略)・・・ flutter_ios_podfile_setup use_modular_headers! # ← ここに移動 target 'Runner' do # use_frameworks! ← ここの記述をコメントアウト # use_modular_headers! ← ここの記述もコメントアウト flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__)) end ・・・(略)・・・
この状態で「pod install」したところ、エラーはなくなり、XcodeからのiOSビルドも無事成功した。
注意点があることを確認
振り返りとして、参考までに、ChatGPTに、ビルドエラーが解消した理由を分析してもらった。
- 「use_frameworks!」を削除した効果:
- 「use_frameworks!」は、CocoaPodsが依存関係をダイナミックフレームワークとしてインストールすることを指定する。
- しかし、ダイナミックフレームワーク内でモジュールが正しく構成されていない場合、モジュール内でヘッダーファイルが読み込まれることができず、エラーが発生することがある。
- この場合、「use_frameworks!」を削除することで、CocoaPodsは静的ライブラリを使用し、ヘッダーファイルの読み込み問題が解消された可能性がある。
- 「use_modular_headers!」をグローバルに変更した効果:
- 「use_modular_headers!」は、CocoaPodsがモジュール内のヘッダーファイルを正しくインポートすることを指定する。
- 「
target 'Runner' do
」ブロック内からグローバルに移動することで、プロジェクト全体でこの設定が適用され、ヘッダーファイルの読み込み問題が解消された可能性がある。
一方、注意点として以下のコメントもあった。
「use_frameworks!」を削除することで、一部のライブラリが正常に機能しない可能性があることに注意してください。必要に応じて、他の依存関係に影響がないか確認してください。
確かにその問題はありそうだ。。
早速、アプリのひと通りの挙動をチェックし、問題ないことは確認したが、今後、同じ手段を使うときは、常にチェックが必要だと認識。
今回、ChatGPTからの情報がなければ、エラーメッセージ中の「globally in your Podfile」に反応することはできなかった。
ChatGPTは、必ずしも直接的な解決策を提示してくれるとは限らないが、ネットでは見つけにくい意味や解釈を教えてくれるので、勘所を広げられる効果があると実感。
\一般的なエラー対処法をまとめた記事はこちら/
リリースしたアプリ(全てFlutterで開発)
個人アプリ開発で役立ったもの
おすすめの学習教材
\超初心者向けでオススメな元Udemyの講座/
\キャンペーン時を狙えば安価で網羅的な内容が学べる(日本語訳あり)/
\Gitの基礎について無料で学べる/
おすすめの学習書籍
\実用的。image_pickerに関してかなり助けられた/
\Dartの基礎文法を素早くインプットできる/