Targetを増やしたらFirebaseのエラーで動かなくなった
アプリのTargetを増やしてビルドしようとしたところ謎のエラーに遭遇しました。
エラー
Undefined symbols for architecture arm64:
"_OBJC_CLASS_$_FIRAnalytics", referenced from:
objc-class-ref in FirebaseAnalitics.o
(maybe you meant: _OBJC_CLASS_$_FIRAnalyticsConfiguration)
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
Showing Recent Messages
:-1: Undefined symbol: _OBJC_CLASS_$_FIRAnalytics
試したけどダメだったやつ
【Xcode】Firebaseを組み込んだ矢先にハマった事(その2)
CocoaPodsでFirebaseをmain target以外に入れることができない問題(解決済)
cocoapodsを導入したプロジェクトでアーキテクチャ周りのビルドエラーになる時
FIRAnalyticsConnector not found
解決方法
調べた中でOther Linker Flagsの中に$(inherited)を追記すれば解決するという記事が多かったので調べてみると$(inherited)は追記されていました。
新規に追加したTargetのOther Linker Flags
$(inherited) -l"c++" -l"sqlite3" -l"z" -framework "CocoaLumberjack" -framework "FirebaseCore" -framework "FirebaseInstanceID" -framework "Foundation" -framework "GoogleUtilities" -framework "RxBluetoothKit" -framework "RxSwift" -framework "Security" -framework "SimulatorStatusMagic" -framework "StoreKit" -framework "Swinject" -framework "SystemConfiguration" -framework "UIKit" -framework "Zip" -framework "iOSDFULibrary" -framework "libb2s" -framework "nanopb"
デフォルトのTargetのOther Linker Flags
$(inherited) -ObjC -l"c++" -l"sqlite3" -l"z" -framework "CocoaLumberjack" -framework "Crashlytics" -framework "FIRAnalyticsConnector" -framework "Fabric" -framework "FirebaseAnalytics" -framework "FirebaseCore" -framework "FirebaseCoreDiagnostics" -framework "FirebaseInstanceID" -framework "Foundation" -framework "GoogleAppMeasurement" -framework "GoogleUtilities" -framework "RxBluetoothKit" -framework "RxSwift" -framework "Security" -framework "SimulatorStatusMagic" -framework "StoreKit" -framework "Swinject" -framework "SystemConfiguration" -framework "UIKit" -framework "Zip" -framework "iOSDFULibrary" -framework "libb2s" -framework "nanopb"
見比べてみると$(inherited)はどちらにも記入されていたのですが、デフォルトのTargetと新規に追加したTargetでは記載されている内容が異なり、
-ObjCやFIRAnalyticsConnectorの部分が抜けていました。
別プロジェクトで同じ環境を作りOther Linker Flagsを確認したところ完全に一致していました。
Podfileの定義
cocoaPodsでFirebaseをmain target以外に入れることができない問題(解決済)という記事で、以下の様に定義すると記載されていたので新規追加したTargetに対してのPodfileは以下の様に定義していました。
target 'ProductDev' do
inherit! :search_paths
end
しかしこの定義の仕方が問題の元凶でした。inherit! :search_pathsではなくFirebase関連のライブラリを新規追加した側のTargetにも全て記載することでそれぞれのTargetのOther Linker Flagsが一致してビルドが通る様になりました。
target 'ToioUpdateDev' do
pod 'Firebase/Core', '5.20.1'
pod 'Firebase/Analytics', '5.20.1'
pod 'Fabric', '1.9.0'
pod 'Crashlytics', '3.12.0'
end
inherit! :search_pathsを定義しておくと大元で定義したライブラリを継承してくれる様なのですがなぜダメだったのかは謎です。
参考にしたいくつかの記事では逆にinherit! :search_pathsを定義しないとエラーになる旨が書かれていたのでなぜ私の環境で成功しているのかも謎です🤔