PC パソコン

Xcode「Undefined symbols for architecture arm64: _swift_coroFrameAlloc」の原因と解決方法

XcodeでSwift製の静的ライブラリやXCFrameworkをリンクした際、「Undefined symbols for architecture arm64: _swift_coroFrameAlloc」と表示され、ビルドが失敗することがあります。

特に、Xcode 26でビルドした静的ライブラリをXcode 16のアプリへ組み込む構成で報告されています。ライブラリが新しいSwiftツールチェーンのランタイムシンボルを参照している一方、古いXcode側のリンカー環境がそのシンボルを提供できないことが主な原因です。

代表的なエラー

Undefined symbols for architecture arm64:
  "_swift_coroFrameAlloc", referenced from:
      ...
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1

arm64と表示されますが、単純な「Excluded Architectures」の設定ミスとは限りません。参照元としてSwiftプロパティのmodifyアクセサ、Concurrency関連コード、または配布された静的ライブラリ名が表示されることがあります。

原因:Swiftコンパイラとランタイムの世代が一致していない

_swift_coroFrameAllocは、新しいSwiftコンパイラが生成するコードから参照されるSwiftランタイムシンボルです。新しいXcodeで作ったバイナリにはこの参照が含まれることがありますが、古いXcodeのリンク環境では解決できない場合があります。

確認されている代表例は次の組み合わせです。

  • 静的ライブラリ:Xcode 26でビルド
  • アプリ:Xcode 16でビルド
  • 両方のDeployment Target:iOS 13

両方のDeployment Targetを同じiOS 13にしても、使用するSwiftコンパイラとランタイムの互換性は揃いません。Deployment Targetは実行可能なOSの下限であり、異なるXcode世代のコンパイル済みSwiftバイナリを互換にする設定ではありません。

このエラーでは、Deployment Target、arm64、署名設定を無作為に変更する前に、「ライブラリを作ったXcode」と「アプリを作るXcode」が一致しているか確認してください。

解決方法1:アプリをXcode 26以降でビルドする

最も直接的な解決方法は、ライブラリと同じか、それより新しいSwiftツールチェーンを含むXcodeでアプリをビルドすることです。

xcodebuild -version
xcode-select -p

複数のXcodeを使っている場合は、CIやターミナルが古いXcodeを参照していないか確認します。

sudo xcode-select -s /Applications/Xcode.app/Contents/Developer
xcodebuild -version

Xcodeを更新した後は、ローカルだけでなくCI、Archive用Mac、チームメンバーの環境も同じツールチェーンへ揃えます。

解決方法2:ライブラリを古いXcodeで再ビルドする

アプリ側をXcode 16から更新できない場合は、ライブラリをXcode 16で再ビルドします。一般に、バイナリ配布物は利用者がサポートする最も古いツールチェーンで作成する方が、後方互換性を確保しやすくなります。

DEVELOPER_DIR=/Applications/Xcode16.app/Contents/Developer \
xcodebuild -project MyLibrary.xcodeproj \
  -scheme MyLibrary \
  -configuration Release \
  -sdk iphoneos   clean build

ライブラリ提供元から受け取ったバイナリの場合は、Xcode 16対応版を依頼するか、ソース配布版を利用して同じXcodeでビルドしてください。

解決方法3:XCFrameworkをツールチェーン別に提供する

ライブラリ提供者は、単一の.aファイルをすべてのXcodeへ流用せず、サポート対象を明示したXCFrameworkを配布します。

xcodebuild -create-xcframework \
  -archive MyLibrary-iOS.xcarchive \
  -framework MyLibrary.framework \
  -archive MyLibrary-Simulator.xcarchive \
  -framework MyLibrary.framework \
  -output MyLibrary.xcframework

ただし、XCFrameworkという形式に変更するだけでSwiftランタイムの世代差が解消されるわけではありません。中身をどのXcodeでビルドしたかが重要です。

どのライブラリがシンボルを要求しているか調べる

リンカーのログで_swift_coroFrameAllocの参照元を確認します。静的ライブラリはnmでも調べられます。

nm -u path/to/libMyLibrary.a | grep swift_coroFrameAlloc

find path/to/Frameworks -type f -perm +111 -print

参照が特定のSDKや広告・動画・Flutter関連のバイナリから出ている場合、そのSDKのXcode 16対応版または更新版を確認します。

BUILD_LIBRARY_FOR_DISTRIBUTIONで直るか

BUILD_LIBRARY_FOR_DISTRIBUTION=YESは、Swiftモジュールインターフェースを生成して異なるコンパイラからモジュールを読み込みやすくする設定です。しかし、古いリンカーに存在しないSwiftランタイムシンボルを追加する機能ではありません。

モジュール安定性とSwiftランタイムの後方互換性は別問題です。設定を有効にしても_swift_coroFrameAllocが未解決なら、ビルドに使うXcodeを揃える必要があります。

避けた方がよい対応

  • _swift_coroFrameAllocを自作関数で定義する
  • Xcode 26からSwiftランタイムライブラリを手作業でコピーする
  • 根拠なく-lswiftCoreや多数のリンカーフラグを追加する
  • arm64をExcluded Architecturesへ追加して実機ビルドを回避する
  • Deployment Targetだけを変更して互換性が得られたと判断する

これらはリンクを一時的に変化させても、ABI不一致や実行時クラッシュを招く可能性があります。

DerivedDataとパッケージキャッシュの整理

ツールチェーンを揃えた後も古い成果物がリンクされる場合は、クリーンビルドを行います。

xcodebuild clean
rm -rf ~/Library/Developer/Xcode/DerivedData/対象プロジェクト-*

Swift Packageを使っている場合は、Xcodeの「File」→「Packages」→「Reset Package Caches」も検討します。キャッシュ削除だけではツールチェーンの不一致は直りません。

確認手順

  1. ライブラリ作成側とアプリ作成側のxcodebuild -versionを記録します。
  2. nm -uで問題のシンボルを要求するバイナリを特定します。
  3. 同じXcodeでライブラリとアプリをクリーンビルドします。
  4. 実機用arm64とSimulator用をそれぞれ確認します。
  5. DebugだけでなくArchiveも実行します。

2026年9月時点の注意

Apple Developer Forumsには、Xcode 26で作成した静的ライブラリをXcode 16でリンクした際の再現報告とFeedback番号FB21130604が掲載されています。一方、2026年9月16日時点で、この組み合わせを古いXcode側の設定だけで安全に互換化するApple公式の回避策は確認できません。

まとめ

「Undefined symbol: _swift_coroFrameAlloc」は、Xcode 26で作られたSwiftバイナリをXcode 16など古いツールチェーンでリンクした場合に起きる可能性があります。基本対応は、アプリ側を新しいXcodeへ揃えるか、ライブラリを利用側と同じ古いXcodeで再ビルドすることです。Deployment Targetやアーキテクチャ設定だけでは解消しません。

参考:Apple Developer Forums: Compiler/再現プロジェクト