まさか私がエンジニアになるなんて

調べてわからなかったこととつまらない日常をまとめる

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 の場合でも機能するための方法を書いております。

考えられる原因

  1. ライブラリが i386 の architecture に対応していない
  2. Target が Test である BuildPhase がきちんと設定されてない

ライブラリが architecture に対応していない

  • simulator と iPhone などの実機とでは CPU が違うため、同じコードでもコンパイルの結果が違います
  • そのため、project を run することはできても、テスト用に build することはできません

対応していないか確認する方法

f:id:nano-041214:20160923185015p:plain

スクリーンショットのように、Carthage/Build/iOS/{framework}/modules/{module}/ 以下に、該当する CPU のビルドがあるかチェックでkます。

ないようならライブラリのページでその CPU のビルドを配布しているかみてみると良いです。

Target が Test である BuildPhase がきちんと設定されてない

おそらくこれで大多数の人はどうにかなるはずです。

画像の箇所を、テストでない方の target と同様の 設定すればオッケーです。 script の内容は環境によって違うと思うので、画像の通りが必ずしも良いとは限りません。

f:id:nano-041214:20160923185018p:plain

ついでに

あとは、テスト内で利用するクラスで、Target Membership の HogeTests にチェックを入れれば動くはずです。

f:id:nano-041214:20160923185019p:plain

最後に

自分の脳の想定よりテストの方が信じられるので、積極的にテストを書いていきたい気持ちです。