Symbol(s) not found for architecture i386 エラーと戦う
Carthage x swift x unitTest の始め方。
Carthage のライブラリを用いて iOS のテストを Swift で書いてみよう! と、思いたち、 UnitTest を書いてみました。 しかし、simulator で run は問題なく動くのに、 test を実行すると import しているライブラリが引っ張ってこれず build が成功しないということで数時間詰まっておりました。
test を実行した際のエラー文がこちら
Undefined symbols for architecture i386: ld: symbol(s) not found for architecture i386 {library_name}: ld returned 1 exit status
スクリーンショットが豊富なまとめがなかなかなかったので、自分なりにまとめてみました。
環境
Xcode 7.3.1, Swift 2.2, Carthage 0.18 このまとめでは、 Carthage で入れたライブラリが Target が test の場合でも機能するための方法を書いております。
考えられる原因
- ライブラリが i386 の architecture に対応していない
- Target が Test である BuildPhase がきちんと設定されてない
ライブラリが architecture に対応していない
- simulator と iPhone などの実機とでは CPU が違うため、同じコードでもコンパイルの結果が違います
- そのため、project を run することはできても、テスト用に build することはできません
対応していないか確認する方法
スクリーンショットのように、Carthage/Build/iOS/{framework}/modules/{module}/ 以下に、該当する CPU のビルドがあるかチェックでkます。
ないようならライブラリのページでその CPU のビルドを配布しているかみてみると良いです。
Target が Test である BuildPhase がきちんと設定されてない
おそらくこれで大多数の人はどうにかなるはずです。
画像の箇所を、テストでない方の target と同様の 設定すればオッケーです。 script の内容は環境によって違うと思うので、画像の通りが必ずしも良いとは限りません。
ついでに
あとは、テスト内で利用するクラスで、Target Membership の HogeTests にチェックを入れれば動くはずです。
最後に
自分の脳の想定よりテストの方が信じられるので、積極的にテストを書いていきたい気持ちです。