fastlaneでiOSシミュレータ用の.appファイルをビルドした時に "ld: building for 'iOS-simulator', but linking in object file (hoge) built for 'iOS'" とエラーが出た時の回避策
これはInfocom Advent Calendar 2023 13日目の記事です.
個人開発iOSアプリケーションのリリースビルドやApp Store Connectへのアップロードにfastlaneを使っています.
今回,iOSシミュレータ用の.app
ファイルをビルドするlaneを新しく追加したのですが,
arm64アーキテクチャのビルドでエラーが出てしまったので,回避策を記録しておきます.
環境
- mac mini 2023 (Apple M2 Pro)
- macOS: 13.5 (Ventura)
- Xcode: 15.0
- CocoaPods: 1.14.3
- fastlane: 2.217.0
問題
過去バージョンのiOSアプリケーションをiOSシミュレータにインストールして動作させるために,
.app
ファイルをビルドして残しておくことにしました.
そこでFastlane
ファイルに以下のようなレーンを定義しました.
lane :appbuild do
build_app(
workspace: "CopyAsLink.xcworkspace",
scheme: "CopyAsLink",
configuration: "Release",
skip_package_ipa: true,
skip_archive: true,
derived_data_path: "/var/tmp",
destination: "generic/platform=iOS Simulator"
)
end
これをfastlane appbuild
のように実行したところ,以下のようなエラーが発生しビルドが失敗しました.
❌ ld: building for 'iOS-simulator', but linking in object file (/hoge/copyaslink/CopyAsLink/Pods/Realm/core/librealmcore-ios.a[arm64][3](alloc.o)) built for 'iOS'
❌ clang: error: linker command failed with exit code 1 (use -v to see invocation)
調べてみると,どうやらCocoaPodsで導入している依存ライブラリの(iOSシミュレータ用ではなく)iOS用バイナリにリンクしようとして発生するエラーのようでした.
cf. Apple Silicon MacでiOSシミュレータを実行できないときの対応方法(arm64バイナリのエラー) - アールケー開発
回避策
はじめはこのStackOverflowの回答を見て試してみたのですが,別のエラーが発生して私の環境では解決しませんでした.
Apple Silicon上でのiOSシミュレータはx86_64アーキテクチャのバイナリを実行できるのでarm64アーキテクチャのバイナリは含めなくてもよい,ということだと理解したので,fastlaneのレーン定義においてxcbuild
アクションを使い,x86_64アーキテクチャのみのビルドにしたところ,うまくビルドできました.
lane :appbuild do
xcbuild(
workspace: "CopyAsLink.xcworkspace",
scheme: "CopyAsLink",
configuration: "Release",
xcargs: "-sdk iphonesimulator17.0 SYMROOT='/var/tmp/' ARCHS=x86_64"
)
end
$ fastlane appbuild
$ file /var/tmp/Release-iphonesimulator/CopyAsLink.app/CopyAsLink
/var/tmp/Release-iphonesimulator/CopyAsLink.app/CopyAsLink: Mach-O 64-bit executable x86_64
出力された.app
ファイルをiOSシミュレータにドロップし,インストールと起動が正常にできることを確認しました.