2011-03-17 63 views
5

我最近從XCode 3升級到4,現在我的iPhone項目出現了問題。我需要將舊版本的iOS支持回3.1。使用XCode 3.2.5,使用SDK 3.1的iOS部署目標,使用SDK 4.2構建沒有問題。我還在libSystem.B庫中包含了一個弱鏈接,這是在較舊的iOS版本上運行應用程序所必需的。現在,當我用XCode 4構建時,出現下面的鏈接器錯誤。編譯步驟完成,但鏈接步驟失敗。如果我刪除了libSystem.B庫的弱鏈接,那麼構建完成,但在iOS 3.1上運行時,該應用程序在啓動時崩潰。如何使用libSystem.B爲iOS 3.1部署目標構建XCode 4?

有沒有人找到解決這個問題的辦法?如何使用XCode 4構建,在舊版本的iOS上運行?

ld: library not found for -lSystem.B collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1

回答

6

在 「其它鏈接器標記」 在你的項目構建設置中添加以下內容:

-weak_library /usr/lib/libSystem.B.dylib

,它就能被自動添加到你的目標構建設置,但如果不是,你應該在那裏添加它。

+0

加入'-weak_library/usr/lib中/ libSystem.B.dylib'到 「其他連接標誌」 導致其被拆分分成兩行:'-weak_library'和'/ usr/lib/libSystem.B.dylib'。這是對的嗎?輸入時是否需要特殊字符? – matm 2011-06-14 17:23:28

+0

它對我來說也是如此。這不應該是一個問題。 – TrevorL 2011-07-13 18:03:42

+0

另請參閱下面的答案。 – matm 2011-07-14 08:34:37

0

這是我一步一步的解決方案:

  1. 我已經從我的朋友的MAC(/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4複製libSystem.B.dylib文件。 2.sdk/usr/lib中/ libSystem.B.dylib)。 ! xCode 3.2.5在他的MAC上安裝了4.0和4.2 SDK。 !
  2. 轉至:ProjectSettings>目標> BuildPhases>鏈接二進制庫>'+'。
  3. '添加其他'。選擇複製libSystem.B.dylib文件(你可以找到它在你的項目包)
  4. 生成...

在此之後,我沒有得到錯誤「未找到-lSystem.B庫」。

而且應用程序運行在設備文件與iOS < 4.

這是非常奇怪的,但似乎這個問題是本地libSystem.B.dylib文件中。 原生 - 我的意思是xCode的4.0.2。

祝你好運。

+0

我假設你已經將朋友的'/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib/libSystem.B.dylib'複製到你MAC上的同一位置(即'/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib /'),是否正確? – matm 2011-06-29 14:02:17

+0

不完全。我沒有替換我自己的(xCode的4.0.2)libSystem.B.dylib文件。我剛剛將該文件複製到項目位置,然後單擊「添加其他」後選擇它。替換也應該有所幫助,但我沒有試圖這樣做。 – mnickv31 2011-06-29 14:31:12

+0

我想我已經找到了原因和適當的解決方案 - 查看我的答案。 – matm 2011-07-01 14:38:50

3

這裏是我的解決方案與SDK 4.3環境的Xcode 4.0.2,但我相信它也應該在其他設置工作。

  1. libSystem.B.dylib不存在 /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib下, 但它是本較低SDK 版本(例如iPhoneOS4.2.sdk
  2. 大多數情況下 libSystem.B.dylib只是一個 符號鏈接libSystem.dylib
  3. 所以 iPhoneSimulator4.3.sdk/usr/lib 我申請以下命令sudo ln -s libSystem.dylib libSystem.B.dylib和我的模擬器 構建再次開始工作:)

注意:libSystem.B.dylib被Flurry和Urban Airship使用,所以你最好不要刪除項目文件中的參考文獻(當然,Urban Airship doesn在模擬器下工作,但我認爲Flurry可以。您的項目中包含的其他圖書館也可能需要libSystem.B.dylib

+0

我同意這個解決方案。我已經在下面發佈了更詳細的推理。 – 2012-07-27 19:46:24

4

確定,weak_library選項是正確的軌道......這裏的問題:

的.B指示系統庫的第二個版本。我猜測一些新的Obj-C特性需要這個(比如Blocks),並且使用支持塊的API的庫等將間接引用.B系統庫。這意味着動態鏈接器將嘗試拉入libSystem.B,但是間接(如果您的代碼不使用這些功能)。

存在兩個相互矛盾的問題:讓應用程序在舊設備上工作,並讓它爲模擬器構建。

爲了讓它在舊手機上運行,​​您必須爲libSystem.B指定一個弱鏈接。弱鏈接基本上使得它比較老的庫不會造成問題。在正常的鏈接中,動態鏈接器需要查找所有可以使用的符號。由於鏈接較弱,鏈接器允許缺少項目。這是蘋果對舊手機支持的一部分......如果它在圖書館中缺少一個符號,請不要擔心。

不幸的是,5.1模擬器SDK不包括libSystem.B.dylib文件,這就是爲什麼幾個解決方案上面的工作排序的......如果你把一個文件中可以找到,它至少拿下沒有死於構建。

儘管如此,確保您瞭解您在製作此文件時所做的操作。您在模擬器上運行時告訴鏈接器鏈接到該庫中,因此它必須具有正確的鏈接,並且必須與框架中的其他庫正確交叉鏈接。

使用/usr/lib/libSystem.B是一個壞主意,因爲這是一個OSX庫,而不是iOS。同樣,鏈接到一個DEVICE庫將會爲你帶來一個arm arch庫,它不會在intel硬件上運行的sim上運行。

從舊SDK中使用libSystem.B是一個更好的主意,並且可能會工作,但鑑於它看起來像蘋果沒有遵循它自己的建議與庫版本(它看起來像5.1版,他們再次丟棄了該版本),我想這也會導致問題。

所以,如果你想支持舊設備,並且希望SIM才能正常工作,這似乎是最好的辦法如下:

  1. 添加libSystem.B.dylib的鏈接與圖書館在構建階段爲可選(這相當於添加其他鏈接器標誌-weak_library,但爲您找到正確的文件)。
  2. 從iOS SIMULATOR框架中的libSystem.dylib創建一個sym鏈接到libSystem.B。

我的推理是,由於.B表示版本控制中的凹凸,並且由於ios5.x將具有股票庫中所有必需的功能,所以假定.B版本與非版本化的庫。和Xcode 4.4(2012年7月),這是用做:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/lib 
sudo ln -s libSystem.dylib libSystem.B.dylib 

真的,這很可能是安全使用任何看起來像一個有效的庫,只是因爲在ios的實際運行時低於5.x它目前不連尋找B版....解決方法是通過舊設備的鏈接階段......但是,似乎此修復程序比上面列出的其他替代方法更安全。

感興趣的一些交叉引用:

Weak Linking in Frameworks

Developer Tools Weak Linking

+0

完美!非常感謝Tony。我需要這個作爲解釋,而不是其他人給出的簡單解決方法 – amergin 2012-11-12 12:59:21

+0

剛升級到4.5.2,同樣的事情又發生了! – amergin 2012-11-26 18:48:59