Categories: swift

GoogleAnalyticsをcocoapods使って複数ターゲットがあるプロジェクトに入れたらビルドできないっ!

タイトル長いけど、メインのTargetと、ユニットテスト用のTargetがあるプロジェクトで、GAを使っているソースをtestターゲットにも紛れたらこんなかんじで怒られた。

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を書いてあげる。

link_with "Hoge", "HogeTest"
pod 'GoogleAnalytics-iOS-SDK', '~>3.10'

ただ、これだとTestターゲットに別にいらなくてもいいライブラリまで紛れ込むのでビルドに時間が掛かる。

対策2 : exclusiveを使う

exclusiveを使えば必要なライブラリをTestターゲットにリンクできる。

以下な感じにPodfileに書いてあげて下さい。

pod 'GoogleAnalytics-iOS-SDK', '~>3.10'

target :"HogeTests", :exclusive => true do
    pod 'GoogleAnalytics-iOS-SDK', '~>3.10'
end

こうすることで必要最低限のライブラリでリンクできるので、ビルド時間も最低限にできる!

これやー!わいが求めていたのはこれやったんやーー!

ということで無事ビルドできました。

めでたしめでたし。

余談

swift使っているとTestターゲットにもソース入れたげないと補完もビルドも出来ないのは、今回の件もあるし、ビルドも長くなるしで非常に不便…

mogmet

View Comments

  • Thanks for sharing. I read many of your blog posts, cool, your blog is very good.

Share
Published by
mogmet