解決方法
- 各プロジェクト設定の"Architectures"を揃えているかどうか確認
- 各プロジェクト設定の"Build Active Architecture Only"で矛盾がないか確認
具体的な話
例はMixpanelをcocoapods経由で組み込んだ際のビルドエラー
"_OBJC_CLASS_$_Mixpanel", referenced from:
objc-class-ref in STAnalytics.o
エラーログの上の方を見ていくとかなり詳細に状態が表示されていた
Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'armv7s' didn't contain all required architectures 'armv7 armv7s arm64'
cocoapodsを使う場合Xcodeはワークスペースを使うが、実際のプロジェクトは'armv7 armv7s arm64'でビルドされるべきなのに、cocoapodsのプロジェクトは'armv7s'しかビルドしていなかったために発生していた様子。
Stackoverflowで同じような症状と解決策を探してみると、podsのプロジェクトの"Build Active Architecture Only"をYESからNOにすべしとあった
CocoaPods arm64 issue
http://stackoverflow.com/questions/19419781/cocoapods-arm64-issue
図のようにどうやらデフォルトYESになっていて、これをNOにすべしということらしい。実際にNOにしてビルドエラーはなくなった。
デフォルトYESなのは理由がある
"Build Active Architecture Only"はビルドしようとしているアクティブなアーキテクチャのみバイナリを生成するかどうかなので、例えばiPhone5(armv7s)実機で開発作業の検証を行っている時はarm64のビルドなどしなくて良いのではないかと思う。よって、開発プロジェクト側もDebugの"Build Active Architecture Only"をpodsプロジェクトと併せてYESにするとビルドが出来るようになった。
おそらく全部NOに統一してしまっても開発はできるが特定の端末で動作を確認したい場合でも全部NOに統一するのはビルド時間が無駄なはず。
まとめ
- Debug,Release毎に各プロジェクトの"Build Active Architecture Only"を揃える
- Xcodeから特定の実機で検証したい場合はDebugビルドの"Build Active Architecture Only"はYES
- それ以外(例えばAdHocやRelease)の場合はNOにする
参考
xcodeのarmv7sビルドエラー
http://spacetimebubble.net/2012/12/26/xcode%E3%81%AEarmv7s%E3%83%93%E3%83%AB%E3%83%89%E3%82%A8%E3%83%A9%E3%83%BC/
Xcode 4.2でarmv6が必要だって怒られる場合の対処方法
http://d.hatena.ne.jp/paraches/20111029