Xcode 12でビルドした時、下のようなエラーが出た時の対応です。
エラーはCocoaPodsで入れたRealmで発生していました。
building for iOS Simulator, but linking in object file built for iOS, for architecture arm64
結論としては、PodfileにEXCLUDED_ARCHSに関する記述を追加してpod installしたら動くようになりました。
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| if target.name.include?('Realm') config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' end end end end
参考にしたのは下URLです。
詳細なエラー内容は下のとおりです。
おそらくRealmのlibrealmcore-ios.aをシミュレータ向けにビルドしようとしたけどarm64になっていたという内容です。
シミュレータはx86_64というアーキテクチャを使うので、正しく指定できてなくてエラーになったのかと思います。
MyApp/Pods/Realm/core/librealmcore-ios.a(bptree.o), building for iOS Simulator, but linking in object file built for iOS, for architecture arm64
各端末で使っているアーキテクチャは以下URLが参考になりました。
iOS・tvOS・watchOS デバイスのアーキテクチャについてのまとめ – ymyzk’s blog
試しにfileコマンドでlibrealmcore-ios.aのアーキテクチャを見た所、arm64だけでなくx86_64にも対応していました。
対応自体はしているので、XcodeのRealmとRealmSwiftのExcluded Architecturesにarm64を指定すればx86_64でビルドできるようになります。
先程も書いた下処理をPodfileに書けば自動でRealmとRealmSwiftにExcluded Architecturesを設定してくれます。
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| if target.name.include?('Realm') config.build_settings['EXCLUDED_ARCHS[sdk=iphonesimulator*]'] = 'arm64' end end end end
この処理によってシミュレータの時だけarm64を除外する設定が追加されます。
DebugのBuild Active Architecture OnlyをYesに変える事で動かすこともできました。
Debugで常にBuild Active Architecture OnlyをYesにしたい場合は下処理をPodfileに記述することで実現できます。
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| if config.name == 'Debug' config.build_settings['ONLY_ACTIVE_ARCH'] = 'YES' end end end end