GoogleAnalyticsをcocoapods使って複数ターゲットがあるプロジェクトに入れたらビルドできないっ!
タイトル長いけど、メインのTargetと、ユニットテスト用のTargetがあるプロジェクトで、GAを使っているソースをtestターゲットにも紛れたらこんなかんじで怒られた。
1 2 3 4 5 6 7 8 9 10 11 |
Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_GAI", referenced from: __TMaCSo3GAI in AnalyticsManager.o "_OBJC_CLASS_$_GAIDictionaryBuilder", referenced from: __TMaCSo20GAIDictionaryBuilder in AnalyticsManager.o "_OBJC_CLASS_$_GAIFields", referenced from: __TMaCSo9GAIFields in AnalyticsManager.o "_kGAIScreenName", referenced from: __TFC11HogeTests16AnalyticsManager10sendScreenfS0_FSST_ in AnalyticsManager.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) |
GAなんてしらねーよヽ(`Д´)ノウワァァァン!!
って怒られた。
Match-O Linker Errorにはいつも泣かされてる気がします。
他のcocoapods使ったライブラリは問題ないのになんでやねーーんとか思ってたんだけど、
cocoapodsの設定をすこしいじったら解決するお話でした。
原因
大先輩のお話によると、他のライブラリはソースコードベースだけど、GAは.aファイルが追加されるため、
テストバイナリにリンクされてないとabornするらしい。(多分
なので、testsターゲットにもリンクさせてあげればおkらしい。
zipzapとかも同じ現象が起きるらしい。
対策1 : link_withを使う
cocoapodsの上の方にlink_withを書いておけばライブラリが全部リンクされるようになる。
HogeとHogeTestというターゲットがあるとするとこんなかんじにPodfileを書いてあげる。
1 2 |
link_with "Hoge", "HogeTest" pod 'GoogleAnalytics-iOS-SDK', '~>3.10' |
ただ、これだとTestターゲットに別にいらなくてもいいライブラリまで紛れ込むのでビルドに時間が掛かる。
対策2 : exclusiveを使う
exclusiveを使えば必要なライブラリをTestターゲットにリンクできる。
以下な感じにPodfileに書いてあげて下さい。
1 2 3 4 5 |
pod 'GoogleAnalytics-iOS-SDK', '~>3.10' target :"HogeTests", :exclusive => true do pod 'GoogleAnalytics-iOS-SDK', '~>3.10' end |
こうすることで必要最低限のライブラリでリンクできるので、ビルド時間も最低限にできる!
これやー!わいが求めていたのはこれやったんやーー!
ということで無事ビルドできました。
めでたしめでたし。
余談
swift使っているとTestターゲットにもソース入れたげないと補完もビルドも出来ないのは、今回の件もあるし、ビルドも長くなるしで非常に不便…