はじめに
Xcode でビルドしようとした際にタイトルのエラーに遭遇したので対処法を書いていきます。
テストターゲットにCarthage で framework を追加しており、アプリをビルドしようとした際に遭遇しました。
前提条件
Mac: macOS Catalina 10.15.6
Xcode: Version 12.4 (12D4e)
Carthage: 0.36.0 (後半で0.37.0 以降にアップデートします)
現象
ビルド時に以下のようなエラーが出ました。

テキストに起こすと以下。
error: Building for iOS Simulator, but the linked framework 'Quick.framework' was built for iOS. (in target 'SampleApp02Tests' from project 'SampleApp02')
SampleApp02 というアプリなんですが、それのTestターゲットに
Quick.framework を追加した状態でのエラーです。
(このエラーメッセージはCarthage のバージョンで少し異なってくるかもしれません)
iOSシミュレータをビルドしているが、
リンクされているのはiOS用(=シミュレータ用ではない)のframeworkです、
と怒られています。
簡単な対処法(ただし根本的ではない)
Stackoverflowに回答があります。
Build Settings
の Validate Workspace
の設定を一度 Yes
にし、その後 No
に変更すればOKです。
デフォルト表示は No
ですが、実際の挙動はどうやら Yes (Error)
となっているようです。

Yes
のままでもエラーは回避できますが、ビルド時にワーニングが出ます。
ただ、この対処法は少なくとも「フレームワークの検証をしない」という状態になるため、
将来的にはビルドできなくなる可能性も出てくるのかなと思います🤔
より根本的な対処法
そもそもの原因
そもそも Validate Workspace が Yes (Error)
でエラーになるのは、
フレームワークの検証で引っかかっているからのようです。
どういうことかと言うと。
Carthage 0.36.0 で作成された framework は、
その中に実機用やシミュレータ用の複数のバイナリが含まれています。
それらが1つのframework として生成されます。
これはuniversal framework もしくは、より直感的に fat framework と呼ばれています。
fat framework のイメージは以下が非常に分かりやすいと思います。
Qiita: XCFrameworksに対応したCarthageを使ってみた CarthageがIntel Mac上でどのように動いていたか
そして、Xcode12.3 からはデフォルト(つまりValidate Workspaceが Yes(Error)
の状態)で
fat framework を弾くようになりました。
そのため、ビルドができなくなったようです。
ちなみにアプリのビルド時、Carthage の copy-frameworks スクリプトを実行していると思いますが、
そこでは fat framework を元に
- 実機ビルドなら実機用のみの framework を出力する
- シミュレータビルドならシミュレータ用のみの framework を出力する
という処理をしているようです。
そこで XCFramework
fat framework が弾かれるようになった。
ではどうするか。
fat framework をやめ、XCFramework を使います。
XCFramework とは何か。
イメージを掴むには、中身を見るのが手っ取り早そうです。

このようにXCFramework の中には複数の framework が含まれています。
ios-arm64-armv7 がiOS用、ios-arm64_i386_x86_64-simulator がシミュレータ用のframework かな🤔
このXCFramework を、既存の framework の代わりにXcode に組み込むことで、
ビルド時にXcode が適切なアーキテクチャのframework を選択してリンクするようになります。
ということは先に述べた copy-frameworks スクリプトも不要になります🙌
XCFramework を使う
主流になりそうだし使った方がよさそう、ということでCarthage でXCFramework を作ります!
そのためには Carthage 0.37.0 以降が必要なので準備しましょう。
準備できたらあとは --use-xcframeworks
オプションを付けて
carthage コマンドを打つだけです。
carthage update --use-xcframeworks --platform iOS
これ以降の導入手順は難しくないです。
DevelopersIO: [iOS] CarthageでもXCFrameworkが使いたい や
Qiita: XCFrameworksに対応したCarthageを使ってみた CarthageでXCFrameworksをビルドする
などが参考になりそうです。
最後に
以上です。
可能ならワークアラウンド的な方法ではなく根本的な対応をすると、
今後困る可能性が減りそうですね🙌
お疲れ様でした!
「[iOS][Xcode] error: Building for iOS Simulator, but the linked framework ‘Hoge.framework’ was built for iOS.というエラーが出たときの対処法」への1件のフィードバック