Xcodeで実機向けにビルドした際、building for iOS, but linking in object file built for iOS Simulator と表示されてリンクに失敗することがあります。このエラーは、iOS実機向けターゲットに対して、iOS Simulator向けにビルドされたライブラリやオブジェクトファイルをリンクしようとしたときに発生します。
エラーメッセージ
building for iOS, but linking in object file built for iOS Simulator
主な原因
- 実機向けビルドでSimulator用バイナリをリンクしている
- Frameworkや静的ライブラリがSimulator向けにしかビルドされていない
- Apple Silicon環境でarm64のSimulator用バイナリと実機用arm64を混同している
- 古いFat Frameworkを使用しており、プラットフォーム情報が正しく分離されていない
- CocoaPodsや手動追加したFrameworkのビルド成果物が古いまま残っている
代表的な発生状況
Simulatorでは正常に動作するのに実機ビルドで失敗する場合や、サードパーティ製SDKを更新・追加した直後、Intel Mac向けに作られた古いFrameworkをApple Silicon Macで使用した場合などに発生しやすいエラーです。
確認手順
1. エラーに表示されるファイルを確認する
Build Logを開き、どのFramework、.a、.oファイルがSimulator向けとして判定されているか確認します。
2. バイナリのアーキテクチャを確認する
lipo -info path/to/Library.a
arm64が含まれているかだけでなく、そのバイナリがiOS用かiOS Simulator用かも重要です。現在は同じarm64でもプラットフォームが異なるため、アーキテクチャ名だけでは判別できません。
3. Build Settingsを確認する
Framework Search Paths、Library Search Paths、Other Linker Flags に古いパスやSimulator専用パスが残っていないか確認します。
解決方法
方法1:実機向けにビルドされたFrameworkへ差し替える
最も確実なのは、iOS実機向けのバイナリを含むFrameworkまたはXCFrameworkへ置き換えることです。SDK提供元がXCFramework版を配布している場合は、そちらを優先します。
方法2:XCFrameworkを作成する
自作Frameworkの場合は、iOS用とiOS Simulator用を個別にArchiveし、XCFrameworkへまとめます。
xcodebuild -create-xcframework \
-framework path/to/iOS/YourFramework.framework \
-framework path/to/Simulator/YourFramework.framework \
-output YourFramework.xcframework
XCFrameworkでは実機用とSimulator用のスライスが明確に分離されるため、同じarm64を含む環境でも適切なバイナリが選択されます。
方法3:CocoaPodsを再構築する
pod deintegrate
pod install
古いPodsビルド成果物が原因の場合は、再インストール後にXcodeでClean Build Folderを実行します。
方法4:DerivedDataを削除する
rm -rf ~/Library/Developer/Xcode/DerivedData
古いSimulator向けビルドキャッシュが残っている場合に有効です。削除後、Xcodeを再起動して再ビルドします。
方法5:リンク設定から古いライブラリを外す
Targetの Build Phases → Link Binary With Libraries を確認し、不要になったFrameworkや重複しているライブラリを削除します。また、Build Settings内の検索パスに古いSDKディレクトリが残っていないか確認します。
注意:一時的にExcluded Architecturesへarm64を追加するとビルドできるケースもありますが、実機向けarm64まで除外すると別の問題を引き起こします。根本的には、実機用とSimulator用のバイナリを正しく分離したFrameworkまたはXCFrameworkを使用するのが安全です。
まとめ
building for iOS, but linking in object file built for iOS Simulator は、実機向けビルドにSimulator向けバイナリが混在していることが原因です。まずエラー対象のライブラリを特定し、実機対応版またはXCFrameworkへ置き換えます。それでも解決しない場合は、検索パス、Link Binary With Libraries、CocoaPods、DerivedDataの順に確認すると切り分けやすくなります。
