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」も検討します。キャッシュ削除だけではツールチェーンの不一致は直りません。
確認手順
- ライブラリ作成側とアプリ作成側の
xcodebuild -versionを記録します。 nm -uで問題のシンボルを要求するバイナリを特定します。- 同じXcodeでライブラリとアプリをクリーンビルドします。
- 実機用arm64とSimulator用をそれぞれ確認します。
- 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やアーキテクチャ設定だけでは解消しません。
