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
(cputype (12) cpusubtype (11))がarmv7sの表示みたいです。