🐒

XCodeのiOSでStatic Libraryをリンク時にエラー

2024/04/11に公開

エラー内容

Apple SiliconのMacでXCode 15で下のようなエラーメッセージが出た。
In /file/path/libYourLibrary.a(someObject.o), building for iOS Simulator, but linking in object file built for iOS, file '/file/path/libYourLibrary.a' for architecture arm64

原因

Apple Siliconが出る以前に作成されたStatic Libraryは、実機でarm64で動作しますが、Simulator用のarm64が入ってません。そのためApple SiliconのMacのデフォルトのarm64向けSimulatorでは動作しません。
根本的にはStatic Libraryをビルドし直し、Simulator向けのarm64用にもビルドし、Simulatorと実機で利用するStatic Libraryが入っているxcframeworkを作る必要があります。

修正の方針

ここで書かれているのは、根本対応ではなく回避策です。
Simulatorをx86_64(Rosetta)で動かす方針とします。

手順概要

①ビルド設定で変な設定がされてないか確認する。
②Simulator用にIntel Chip向けにビルドすると動作する。このためにRosettaのSimulatorを選べば良い。Rosettaを選ぶとx86_64向けにバイナリができて、Apple SiliconのMacならArm64で動作する。
詳細は以下です。

ビルドの設定の確認

Build Settingsで以下を確認する。
Exclude Architectures
に何も設定されていないこと。
Build Active Architecture Only
がNoに設定されていること。

RosettaのSimulatorを選べるようにする。

あとはエミュレーターでRosettaを選べれば良い。
XCodeのメニューの[Product]->[Destination]でRosettaのシミュレーターが見えればそれを選ぶ。
見えなければ[Product]->[Destination]->[Show All Run Destinations]を選ぶとRosettaのシミュレーターが見えるようになるので、サイドメニューから開いてそれを選ぶ。

Simulatorで実行

メニューの[Product]->[Clen build fololder]でキャッシュをクリアする。
そして、iPhone 17 Xr(Rosetta)などと書かれたRossetaのシミュレーターを選ぶ。
実行すると、自分の環境ではSimulatorで動作した。

おしまい。以下は見る必要がない。

調べた経緯

自分の場合はApple SiliconのMacでこのエラーが出た。
まず、Static Libaryの対応アーキテクチャを調べてみる。

lipo -info /file/path/libYourLibrary.a
Architectures in the fat file: /file/path/libYourLibrary.a are: i386 armv7 armv7s x86_64 arm64

i386 armv7 armv7s x86_64 arm64が入ってるので大丈夫そう。(今思えば、arm64は実機用でsimulator用ではないのでダメ。)

https://forums.developer.apple.com/forums/thread/727665
によると、XCode 14.2までは、
Clean DerivedData and Build
Run Xcode on Rosetta
Exclude Architectures
→ Any iOS Simulator SDK → arm64
Build Active Architecture Only
→ Already set Yes for Debug
Delete everything related to Xcode, and downgrade to Xcode 14.2.
と設定などして動いたようだが、XCode 14.3からはこの設定をせずにただRossetaのアーキテクチャで動かせばいいらしい。

Rosetta向けシミュレーターの出し方が14.3では
Menubar → Product → Destination → Destination Architectures → Show Both
であったようだ。

Discussion