rakuishi.com

iOS: Nend SDK 2.0 に含まれている SBJson が重複する時の解決方法(duplicate symbols エラーを回避する方法)

広告ネットワーク Nend の SDK がバージョン 2.0 にアップデートされました。広告識別子の利用開始と、ターゲティング広告をユーザー側が拒否できる(オプトアウト)できる仕組みが用意されたようですね。

主な変更点

主な変更点は、以下となります。

■ 必須フレームワークの追加
・AdSupport.framework

■ メソッド、プロパティの追加 【追加】
@property (nonatomic) BOOL isOutputLog;
エラーログや警告ログを、NSLog として出力するかどうかの指定(任意)

【廃止予定】
@property (nonatomic, assign) UIViewController *rootViewController;
モーダルビュー表示元のビューコントローラの指定(任意) → 2.0.0 時点では廃止しておりません。利用している場合は警告ログが出ますので、今後は利用しないようにしてください。

■ スレッド
ver2.0.0 より、delegate メソッドでの通知の際、一律メインスレッドで通知を行うよう変更されました。
以前のバージョンからの入れ替えの際、サブスレッドで通知を受ける前提での実装がある場合には十分にご注意ください。

また、上記に加えて SDK の静的ファイル libNendAd.a には、SBJson が含まれるようになったようです。

プロジェクト上の他のファイルで、SBJson を利用している場合や、他の静的ファイルにも SBJson が含まれている場合、以下の様なエラーが出ます。

ld: 6 duplicate symbols for architecture armv7

この SBJson が重複する際の回避方法として、libNendAd.a から SBJson を取り除く方法を紹介します。

SBJson が重複する問題を解決する

Xcode のエラーを再度見返してみると libNendAd.a に含まれている以下の 2 つのファイルが重複しているみたいです。この 2 つのファイルを静的ファイル libNendAd.a から削除します。

libNendAd.a(SBJsonParser.o)
libNendAd.a(SBJsonWriter.o)

まずは、“lipo -info” 命令でどのアーキテクチャに対応しているかを確認します。

$ lipo -info libNendAd.a
Architectures in the fat file: libNendAd.a are: armv7 (cputype (12) cpusubtype (11)) i386

armv7, i386 をそれぞれ分解します(作業フォルダ内でファイルが生成されます)。

$ lipo -thin armv7 libNendAd.a -output libNendAd.a_armv7
$ lipo -thin i386 libNendAd.a -output libNendAd.a_i386

SBJson が含まれているファイルを検索します。

$ ar -t libNendAd.a_armv7|grep SBJson
NSObject+SBJson.o
SBJsonParser.o
SBJsonStreamParser.o
SBJsonStreamParserAccumulator.o
SBJsonStreamParserAdapter.o
SBJsonStreamParserState.o
SBJsonStreamWriter.o
SBJsonStreamWriterAccumulator.o
SBJsonStreamWriterState.o
SBJsonTokeniser.o
SBJsonUTF8Stream.o
SBJsonWriter.o

ここに含まれている SBJsonParser.o, SBJsonWriter.o を削除します

$ ar -dv libNendAd.a_armv7 SBJsonParser.o SBJsonWriter.o
d - SBJsonParser.o
d - SBJsonWriter.o

$ ar -dv libNendAd.a_i386 SBJsonParser.o SBJsonWriter.o
d - SBJsonParser.o
d - SBJsonWriter.o

最後に結合して、新しい libNendAd.a の出来上がりです。

$ lipo -create libNendAd.a_i386 libNendAd.a_armv7 -output libNendAd.a

これを今までエラーが出ていたプロジェクトに突っ込むとエラーが消えているはずです。

参考:Xcode でビルドした時の”duplicate symbols”エラーを回避する #Objective-C #Xcode #iOS - Qiita