2010-05-26 73 views
14

我有兩個似乎使用相同類的第三方庫。這應該是罰款,但建設時,我得到這個類型的錯誤:如何處理來自第三方庫的重複符號錯誤?

ld: duplicate symbol .objc_class_name_CJSONScanner in /Users/myappOne/TapjoyConnect/Frameworks/libTapjoyConnectSimulatorRewardInstall_Ads_Pinch.a(CJSONScanner.o) and /Developer/Projects/BuildOutput/Debug-iphonesimulator/OtherLibrary_d.a(CJSONScanner.o) 

我該如何處理這個問題?

- 編輯 -

...如果源文件不可用?

回答

0

如果您有兩個靜態庫的源代碼,請在沒有CJSONScanner類的情況下構建其中的一個。如果你不這樣做,你可以使用命令行中的「ar」從其中一個庫中提取CJSONScanner.o。

可能有一些魔法標記可以傳給「ld」來解決這個問題,但我不知道它是否在手邊。

+0

「ar」是什麼意思? – user230949 2010-05-26 05:34:21

+0

簡單地說,'ar'是命令行工具的名稱。如果你輸入'man ar',你會看到詳細的信息,包括功能描述:「創建和維護庫檔案」。 '-x'選項是用於提取的,但是您似乎希望用'-d'來刪除。 – 2010-05-26 05:58:46

+0

這些很可能是胖文件,單靠'ar'是不夠的。他還需要'lipo'和'libtool'來做到這一點。 – 2010-05-26 06:08:56

31

我打算假設這些是僅向您提供.a文件而不是源代碼的兩個第三方庫。您可以在終端上使用libtool,lipo和ar來提取和重新組合文件。

要看到的是什麼樣的體系文件中:

$ lipo -info libTapjoy.a 
Architectures in the fat file: libTapjoy.a are: armv6 i386 

然後只提取ARMv6的,例如:

$ lipo -extract_family armv6 -output libTapjoy-armv6.a libTapjoy.a 
$ mkdir armv6 
$ cd armv6 
$ ar -x ../libTapjoy-armv6.a 

然後,您可以提取從其他圖書館相同的架構到相同目錄,然後像這樣重新組合它們:

$ libtool -static -o ../lib-armv6.a *.o 

然後最後,af之三,你已經這樣做了,每個架構,你可以用脂再次將它們結合起來:

$ cd .. 
$ lipo -create -output lib.a lib-armv6.a lib-i386.a 

這應該擺脫任何重複的符號,也將兩個庫合併爲一個。如果您想將它們分開,或者只是從一個庫中刪除重複項,則可以相應地修改該過程。

+0

那麼,這是否意味着我的項目應該只引用lib.a而不是其他兩個庫文件? – user230949 2010-05-26 06:12:41

+0

如果你要完全按照我做的那樣做,那麼是的,你會刪除其他兩個文件並使用新的文件。 – 2010-05-26 17:33:20

+0

我剛剛在lib上找到了一個lib,在調用'lipo -extract_family armv6'之前,我不得不調用'lipo -remove armv7'。 – Liron 2012-06-14 13:20:13

1

Cory Kilger的答案是正確的方式去...只是一個小調整,因爲我沒有評論的聲譽。

在我的Mac OS 10.8系統,該脂命令是我用來製造使用的.a文件與AR的一個:

lipo -thin armv6 -output libTapjoy-armv6.a libTabjoy.a 

的脂手冊頁說-extract和-extract_family都產生通用.a文件和我的ar命令不會從中提取任何內容。