- Published on
【Xcode】ライブラリが参照できずクラッシュする時はビルドターゲットを見直す
- Authors
- Name
- yuku_tas
- @yuku_tas
起きた問題
自作のフレームワーク (Xcode11から対応している最新の方法
.xcframework
でなく、
lipo
コマンドで生成したユニバーサルフレームワーク) を組み込んだiPhoneアプリのXcodeプロジェクト。起動直後にエラーが出てクラッシュする問題にめちゃくちゃ詰まりました。
治し方がわかれば速攻で、シンプルに解決できました。
経緯
今回の問題につき当たった時の前提条件は以下。
Xcode12でのビルド時はクラッシュなどは発生していませんでした。
Xcode13に乗り換え、実機でビルドを行ったところ、以下のようなエラーメッセージが発生してクラッシュが生じました。
dyld[33014]: Symbol not found: __ZN5swift34swift50override_conformsToProtocolEPKNS_14TargetMetadataINS_9InProcessEEEPKNS_24TargetProtocolDescriptorIS1_EEPFPKNS_18TargetWitnessTableIS1_EES4_S8_E
Referenced from: /private/var/containers/Bundle/Application/D683B472-9999-47D8-87ED-79C29F239688/Test.app/Frameworks/test.framework/test
Expected in: /private/var/containers/Bundle/Application/D683B472-9999-47D8-87ED-79C29F239688/Test.app/Frameworks/Alamofire.framework/Alamofire
Symbol not found: __ZN5swift34swift50override_conformsToProtocolEPKNS_14TargetMetadataINS_9InProcessEEEPKNS_24TargetProtocolDescriptorIS1_EEPFPKNS_18TargetWitnessTableIS1_EES4_S8_E
Referenced from: /private/var/containers/Bundle/Application/D683B472-9999-47D8-87ED-79C29F239688/Test.app/Frameworks/test.framework/test
Expected in: /private/var/containers/Bundle/Application/D683B472-9999-47D8-87ED-79C29F239688/Test.app/Frameworks/Alamofire.framework/Alamofire
(lldb)
Alamofireが見つからないという話のようだが、これだけではヒントとして十分でないところです...。
iOS Simulatorでビルドを行った際にも、参照パスが異なるだけで同様のエラーメッセージとなり、起動直後にクラッシュしました。
解決方法
かなり試行錯誤をしました。。
他にも、自作フレームワークを取り込む際にはちょっと状況が変わると、ハマりポイントが多いように感じます。例えば、
ライブラリの方のビルドが古いと、Swiftバージョン不整合としてエラーメッセージが吐かれる。
=>
こちらのポスト
が参考になる
No such module"Alamofire"
とでて、
ビルド以前にPodsの各ライブラリへの参照が通らない
=> アプリのDerivedDataを消して、再起動、クリーン、ビルドで解決。
こちらのポスト
を参照
こうした問題を過去に解決した上で、今回の事象につきあたったため、他の原因などを色々疑り時間を浪費してしまいました。
結果としては、灯台下暗しというか...
ライブラリの方のプロジェクトの、Deployment Targetのバージョンを「13.0」から「14.0」に変更した
ら。
これだけで無事アプリが立ち上がるようになりました。
Xcode12でビルドしていた時は、
このバージョン不整合は無視されてようで、結果的に問題が起きていないように見えていただけ
なのかもしれません。
まとめ
こういう過去からの開発経緯が絡んでいたりする問題は、なかなかネット上に解決方法がなく、時間を浪費してしまうものですね。
かつ、Swiftはコンパイラ言語なので、
今回のように「Alamofireが参照できない」というような事実のみを開発者に対して出力し
、
理由を語ってくれないことも多い。
それだけに、PHPのようなLL言語に比べて
エンジニアが事象の原因を考える力が問われているな
と感じました。