Carthage で入れてる Realm が Xcode12.5 環境だとビルドできない問題に対処した

Xcode をバージョンアップしたら何故かアプリがビルドできなくなったのですが色々やったらビルドできるようになったのでその方法を紹介します。

僕はこの問題の根本の理由は理解しておらず、一時的な対処方法な点をご了承ください。

環境

  • Apple Silicon (M1) 環境
  • Carthage 0.37.0 or elliottwilliams:release/0.38.0
  • Realm v10.7.4
  • Xcode 12.5

現象

アプリをビルドしたら以下のようなエラーが発生しました。

エラー内容

Undefined symbol: _OBJC_CLASS_$_RLMThreadSafeReference
Undefined symbol: _OBJC_CLASS_$_RLMObject
Undefined symbol: _OBJC_METACLASS_$_RLMObject
Undefined symbol: _RLMNotVersioned
Undefined symbol: _OBJC_CLASS_$_RLMRealmConfiguration
Undefined symbol: _OBJC_CLASS_$_RLMRealm

合わせて以下のような警告も発生しました(長いので一部略)。

警告内容

ld: warning: ignoring file <略>DerivedData//Build/Products/Debug-iphonesimulator/RealmSwift.framework/RealmSwift, missing required architecture arm64 in file  <略>/DerivedData//Build/Products/Debug-iphonesimulator/RealmSwift.framework/RealmSwift (2 slices)

ld: warning: ignoring file <略>/DerivedData//Build/Products/Debug-iphonesimulator/Realm.framework/Realm, missing required architecture arm64 in file  <略>/DerivedData//Build/Products/Debug-iphonesimulator/Realm.framework/Realm (2 slices)

画像で見るとこんな感じです。

f:id:mironal:20210430105831p:plain
ビルドエラーのスクショ

対処

いろいろ試したのですが、どうも carthage のプレビルドバイナリは Xcode12.5 に互換性がなくて、 carthage 経由でビルドされたバイナリもなにか問題があるようです。

試しに、 carthage がチェックアウトしてきた Realm のプロジェクトを自前でビルドしてその xcframework を使ったらうまく動作しました。

手順は以下のとおりです。

  • すでに carthage で checkout してきている前提
    • されてなかったら carthage checkout してください
  • プロジェクトのディレクトリに入る cd ./Carthage/Checkouts/realm-cocoa
  • ビルドスクリプトで xcframework をビルド ./build.sh xcframework
  • build ディレクトリ内にできた Realm.xcframework と RealmSwift.xcframework を Carthage/Build にコピー

これをやってからビルドしたら無事ビルドできました。

似たような現象..?

なんとなく v10.7.4 でなんかおかしくなってる問題が issue になっていたのですがよくわかりませんでした..