Xcodeでビルドした時の”duplicate symbols”エラーを回避する
FacebookSDKやAWSiOSSDKなど、いろんなライブラリをブチ込みまくると
ld: - duplicate symbols for architecture ---
と言うエラーがよく出る。
重複して使われているライブラリ(SBJsonとか)が出るとこのようなエラーがでてしまう。
くっそ!
そしてググりまくって回避方法を見つけました(`・ω・´)
今回はFacebookとAWSの.frameworkの衝突を回避する例を紹介します。
まず普通にビルドすると、
duplicate symbol _OBJC_CLASS_$_SBJsonParser in: .../Build/Products/Debug-iphoneos/libFacebook SDK.a(SBJsonParser.o) . . . . . XcodeWorkspace/aws-ios-sdk-1.4.3/AWSiOSSDK.framework/AWSiOSSDK(SBJsonWriter.o) ld: 6 duplicate symbols for architecture armv7 clang: error: linker command failed with exit code 1 (use -v to see invocation)
お、おぅ、となります。
○SBJsonParser.o
○SBJsonWriter.o
これらがFacebookSDKとAWSのSDKで使われてるから怒られる。たぶん。
なので、AWSiOSSDKの方からこれらを消してあげます。
まず下記コマンドで、どのアーキテクチャ用になってるかチェック。
$lipo -info AWSiOSSDK Architectures in the fat file: AWSiOSSDK are: armv7 (cputype (12) cpusubtype (11)) i386
armv7とi386のアーキテクチャ用にビルドされてるそうです。
下記コマンドで分解。
$lipo -thin armv7 AWSiOSSDK -output AWSiOSSDK_armv7 $lipo -thin i386 AWSiOSSDK -output AWSiOSSDK_i386
.oファイル検索
$ar -t AWSiOSSDK_armv7|grep SBJson SBJsonParser.o SBJsonStreamParser.o SBJsonStreamParserAccumulator.o SBJsonStreamParserAdapter.o SBJsonStreamParserState.o SBJsonStreamWriter.o SBJsonStreamWriterAccumulator.o SBJsonStreamWriterState.o SBJsonTokeniser.o SBJsonUTF8Stream.o SBJsonWriter.o
あったあった。
目的のファイル削除。
ar -dv AWSiOSSDK_armv7 SBJsonParser.o SBJsonWriter.o ar -dv AWSiOSSDK_i386 SBJsonParser.o SBJsonWriter.o
合体!
lipo -create AWSiOSSDK_armv7 AWSiOSSDK_i386 -output AWSiOSSDK
これでビルドすると。。。。
Building...... (´・ω・`)
Succeed!いぇーす!おめでとう!
*追記
armv7sのライブラリ抽出は下記で可能。
xcrun -sdk iphoneos lipo -thin armv7s AWSiOSSDK -output AWSiOSSDK_armv7s