70
Help us understand the problem. What are the problem?

More than 5 years have passed since last update.

posted at

updated at

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

(cputype (12) cpusubtype (11))がarmv7sの表示みたいです。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Sign upLogin
70
Help us understand the problem. What are the problem?