好的,weak_library 选项是正确的方法...问题如下:
.B 表示系统库的第二个版本。我猜一些较新的 Obj-C 功能需要这个(如 Blocks),并且使用为块提供 API 支持的库等将间接引用 .B 系统库。这意味着动态链接器将尝试拉入 libSystem.B,但间接(如果您的代码未使用这些功能)。
有两个相互竞争的问题:让应用在旧设备上运行,以及让它为模拟器构建。
要让它在旧手机上运行,您必须为 libSystem.B 指定一个弱链接。弱链接基本上使得缺少位的旧库不会引起问题。使用普通链接,动态链接器需要找到所有可以使用的符号。对于弱链接,链接器允许丢失项目。这是 Apple 对旧手机支持的一部分……如果库中缺少符号,请不要担心。
不幸的是,5.1 模拟器 SDK 不包含 libSystem.B.dylib 文件,这就是为什么上面的几个解决方案都可以工作的原因......如果你把一个文件放在里面可以找到,它至少不会'构建时不会死。
不过,请确保您在制作此文件时了解自己在做什么。您是在告诉链接器在模拟器上运行时链接该库...因此,它必须具有正确的拱门,并且必须与框架中的其他库正确交叉链接。
使用 /usr/lib/libSystem.B 是个坏主意,因为这是一个 OSX 库,而不是 iOS 库。同样,链接到 DEVICE 库将为您提供一个带有 arm arch 的库,这在英特尔硬件上运行的 sim 中不起作用。
使用旧 SDK 中的 libSystem.B 是一个更好的主意,并且可能会起作用,但鉴于 Apple 似乎没有遵循它自己的库版本控制建议(看起来他们在 5.1 中再次放弃了该版本) ,我猜这也会导致问题。
因此,如果您想支持旧设备,并且希望 sim 正常工作,最好的方法似乎如下:
- 将 libSystem.B.dylib 添加到 Build Phases 中的 Link With Libraries 作为 OPTIONAL(这相当于添加另一个链接器标志 -weak_library,但会为您找到正确的文件)。
- 创建从 iOS SIMULATOR 框架中的 libSystem.dylib 到 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