2012-01-06 103 views
24

我有一個非ARC項目,使用啓用ARC的靜態庫。這是一個受支持的方案,以便一切正常。也就是說,直到我在4.x設備上運行代碼,包括模擬器。在這種情況下,代碼炸燬與下面的鏈接器錯誤:ARC支持靜態庫鏈接到非ARC項目導致鏈接器錯誤

dyld: lazy symbol binding failed: Symbol not found: _objc_storeStrong 
    Referenced from: /Users/zoul/Library/Application Support/iPhone Simulator/4.3.2/Applications/…/Demo.app/Demo 
    Expected in: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/System/Library/Frameworks/Foundation.framework/Foundation 

會發生這種情況,只要一些啓用ARC-代碼的嘗試在init方法(self = [super init])來調用_objc_storeStrong功能,等等。將主項目轉換爲ARC可解決問題,但我想知道是否還有其他解決方案。

+0

您是否使用支持ARC的LLVM進行鏈接? – Krizz 2012-01-06 10:37:13

+0

首先:工具鏈可能只是在主項目啓用ARC時添加了一個鏈接庫。如果您無法在成績單中找到它,那麼您可以通過編譯一個來源與ARC進行鏈接。 – justin 2012-01-06 10:41:51

+1

這是個好主意,@Justin!單個支持ARC的文件的技巧並不奏效,但我設法找到了鏈接器包含庫的正確參數,它似乎可行。你可以取悅這個答案嗎?一個簡單的會做,我會編輯它來添加細節。 – zoul 2012-01-06 10:48:24

回答

30

我認爲工具鏈可能已經添加了必要的庫鏈接,以便ARC正常工作。所以鏈接器轉錄本可能包含這條信息。如果應用程序本身的項目沒有啓用ARC,您可能默認不會獲得這些內容,但您仍可以通過明確定義它們來鏈接到它們。看看構建腳本,你確實可以在那裏找到適當的鏈接器標誌:它被稱爲-fobjc-arc(就像相關的編譯器標誌一樣)。當您將此設置添加到其他鏈接器標誌時,鏈接器將包含主庫版本的ARC庫,並且代碼運行良好。

+0

非常感謝,這個答案是一整個下午試圖找出這一點後的生命保護程序! – AliSoftware 2012-03-21 17:02:25

+2

這從Xcode 4.3.2開始不再起作用。 '-fobjc-arc'似乎是lib工具的無效標誌。 (「-fobjc-arc」中的「未知選項字符f」) – 2012-03-26 12:24:58

+3

我可以證實這在Xcode 4.3.2中起作用。我剛剛做到了,編譯器在爲模擬器構建時沒有抱怨任何事情。 – csotiriou 2012-05-12 15:04:15

5

我添加了一個新的答案,因爲之前接受的解決方案不再適用於Xcode 4.3.2。我只能假設-fobjc-arc鏈接器標誌從未被公開,現在已被刪除。

這似乎是一個已知問題,儘管the only thread I can find on this與來自蘋果評論devforums的人可以追溯到2011年年中。從該線程,因此建議手動鏈接以下文件解決了這個問題:

${DEVROOT}/Platforms/iPhoneOS.platform/Developer/usr/lib/arc/libarclite_iphoneos.a 

這需要您使用最新的編譯器/ SDK雖然被編譯。我在未經測試的情況下提交此答案,請注意是否有效,如果不適用,請立即投訴!

+0

Upvoting,因爲這是一個有用的補充。還沒有測試。 – zoul 2012-03-28 14:02:44

+1

DEVROOT似乎不適合我。我使用了:'庫(庫)搜索路徑中的$(PLATFORM_DEVELOPER_USR_DIR)/ lib/arc'和'-larclite_iphoneos'的特定於設備的鏈接器標誌 – 2012-04-12 19:56:30

+0

有用的補充,但我還沒有找到爲什麼只添加-fobjc-arc在Xcode 4.3.2中,鏈接器標誌仍然適用於我 – csotiriou 2012-05-12 18:15:31