ottijp blog

fastlaneでiOSシミュレータ用の.appファイルをビルドした時に "ld: building for 'iOS-simulator', but linking in object file (hoge) built for 'iOS'" とエラーが出た時の回避策

  • 2023-12-13

これは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の回答を見て試してみたのですが,別のエラーが発生して私の環境では解決しませんでした.

cf. Xcode building for iOS Simulator, but linking in an object file built for iOS, for architecture ‘arm64’ - Stack Overflow

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シミュレータにドロップし,インストールと起動が正常にできることを確認しました.

refs


ottijp
都内でアプリケーションエンジニアをしています
© 2024, ottijp