確定,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才能正常工作,這似乎是最好的辦法如下:
- 添加libSystem.B.dylib的鏈接與圖書館在構建階段爲可選(這相當於添加其他鏈接器標誌-weak_library,但爲您找到正確的文件)。
- 從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
加入'-weak_library/usr/lib中/ libSystem.B.dylib'到 「其他連接標誌」 導致其被拆分分成兩行:'-weak_library'和'/ usr/lib/libSystem.B.dylib'。這是對的嗎?輸入時是否需要特殊字符? – matm 2011-06-14 17:23:28
它對我來說也是如此。這不應該是一個問題。 – TrevorL 2011-07-13 18:03:42
另請參閱下面的答案。 – matm 2011-07-14 08:34:37