Xcodeでビルドした時の”duplicate symbols”エラーを回避する

More than 5 years have passed since last update.

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の表示みたいです。