2011-12-04 35 views
12


一些背景 - 我已經建立了使用Diney指南自定義框架在http://db-in.com/blog/2011/07/universal-framework-iphone-ios-2-0/LD:在iOS 4.3符號重複_objc_retainedObject,但不能在iOS 5.0

它兩個的ARMv6/ARMv7的,它的建成ARC-編制了4.3的解構目標。

當我把得到的框架放在一個5.0項目中時效果很好,但是當我把它放在一個4.3項目(ARC或非弧,沒關係)時,我得到以下我無法理解的內容。 ..

我也嘗試手動添加libarclite.a,但它沒有改變任何東西。

LD:重複的符號_objc_retainedObject在/Users/freak4pc/Project/MyFramework.framework/MyFramework和/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(arclite.o)對於建築的ARMv7 命令/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/clang失敗,退出代碼1

將不勝感激任何幫助。
謝謝
Shai

+0

爲什麼不像其他人一樣爲iOS創建一個靜態庫?您鏈接的方法看起來像是一種黑客攻擊,所以我並不感到驚訝,事情可能無法按預期進行鏈接。 –

+0

嗯,我剛剛得到一個建議,靜態庫不靈活。你能聯繫我一些資源嗎? –

+0

我不確定在這種情況下「不太靈活」是什麼意思。如果你有你的庫的代碼,那麼靜態庫和框架之間的用法差別不大。如果你要發佈預編譯庫,你所要做的就是確保頭文件也可用。有關這方面的示例,請參閱Core Plot庫:http://code.google.com/p/core-plot/,它使用適用於Mac的框架和適用於iOS的靜態庫。我不記得很難在那裏設置靜態庫編譯。 –

回答

15

我正在努力解決同樣的問題。解決方法是將你的框架的部署目標設置爲iOS5(檢查它是否不會產生其他問題)。

然後你必須在主項目中使用ARC如果定位iOS4,否則libarclite將會丟失。我的解決方案是提供兩個框架,具體取決於他們是否使用ARC。

這裏有兩個鏈接到蘋果開發論壇,多一點點信息: https://devforums.apple.com/message/539344#539344

https://devforums.apple.com/message/588316#588316

更新: 有一個更好的辦法。只需構建帶有iOS5最低目標的靜態庫,並手動添加/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(和/Developer/usr/lib/arc/libarclite_iphonesimulator.a),如果您的項目是而不是使用ARC並需要iOS4支持。

更新2:其實,只需使用鏈接器標誌-fobjc-arc;如果它不在那裏,這將把libarclite和圖書館聯繫起來。最佳解決方案

+0

這不是一個壞主意,生病了吧!謝謝 ! –

+0

謝謝,這是一個更好的方法。手動添加/Developer/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a(和/Developer/usr/lib/arc/libarclite_iphonesimulator.a) – HelloWorld

2

哇,這是一個艱難的騎,但我終於解決了它!

是什麼引發了最後的想法是@ steipete的評論, 它的一些複雜的情況,所以我會嘗試解釋它爲任何人也可能越過這個問題。

  1. 在iOS 4.3上編譯支持ARC的框架會自動將libarclite.so附加到「橋接」4.3 ARC和5.0 ARC之間。當這個框架被導入到一個4.3項目中時,arclite實際上被鏈接了兩次 - 一次是框架(4.3),另一次是項目本身 - 導致了「重複符號」錯誤,意味着框架必須編譯5.0,而該項目可以是4.3。但是之後 ;
  2. 我的框架使用@mattt的AFNetworking來執行不同AP的HTTP請求和JSON解析。如果您的目標是iOS5,AFNetworking會在編譯時自動檢查,如果是,則使用NSJSONSerialization,否則它將回退到任何導入的JSON庫,如JSONKit
  3. 編譯我的支持AFNetworking的iOS5框架(以避免問題1)時,它會自動附加NSJSONSerialization,這將在4.3項目上導致異常,這意味着您將不得不手動查找編譯指令並刪除在編譯之前調用NSJSONSerialization,所以它會自動回落到兼容4.3的庫(在我的例子中爲JSONKit)。在AFHTTPClient.m和AFJSONRequestOperation.m(例如#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6)上找到該編譯條件(例如#if __IPHONE_OS_VERSION_MIN_REQUIRED > __IPHONE_4_3 || __MAC_OS_X_VERSION_MIN_REQUIRED > __MAC_10_6
  4. 刪除這些條件後,我用JSONKit而不是NSJSONSerialization成功編譯了我的iOS5框架,併成功地在我的iOS4.3中使用它項目。

希望這會幫助別人誰可能會爲此努力奮鬥幾天的像我一樣:)

曬。

+0

老實說,我沒有看到你的答案增加了更多的價值(#2,#3和#4與這個問題甚至沒有關係),所以它留下一個苦澀的味道,你標記你的自己的答案是正確的。你也錯過了解釋你的主項目必須使用ARC的問題,如果你使用的ARC不添加libarclite.so在一個子項目中,如果它需要支持iOS 4.x. – steipete

+0

我很抱歉,但我真的不同意你的看法。我把你的答案標記爲「正確的」沒有問題(我沒有得到積分來標記自己的答案) - 但我認爲我的答案更完整,因爲它解釋了整個過程。 2-3-4是什麼導致我不能使用你的小費,所以他們是非常相關的。另外,我確實相信我的問題,所以調用什麼是相關的,什麼不是我的選擇。我非常感謝你的幫助,但我認爲你的評論不合適。 –

+1

必須同意steipete。您的「答案」可能與您的項目有關,但與我們所看到的問題無關。 – wuf810