【问题标题】:How can I build in XCode 4, for an iOS 3.1 deployment target, using libSystem.B?如何使用 libSystem.B 在 XCode 4 中构建 iOS 3.1 部署目标?
【发布时间】:2011-03-17 22:49:47
【问题描述】:

我最近从 XCode 3 升级到 4,现在我的 iPhone 项目出现了构建问题。我需要支持旧版本的 iOS 回到 3.1。使用 XCode 3.2.5,我使用 SDK 4.2 构建没有问题,使用 iOS 部署目标 3.1。我还包含了一个指向 libSystem.B 库的弱链接,这是在旧 iOS 版本上运行应用程序所必需的。现在,当我使用 XCode 4 构建时,出现下面的链接器错误。编译步骤完成,但链接步骤失败。如果我删除 libSystem.B 库的弱链接,则构建完成,但应用程序在 iOS 3.1 上运行时在启动时崩溃。

有没有人找到解决这个问题的方法?如何使用 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

【问题讨论】:

    标签: ios linker xcode4


    【解决方案1】:

    在“其他链接器标志”下的项目构建设置中添加以下内容:

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

    它应该自动添加到您的 Target 构建设置中,但如果不是,您也应该将它添加到那里。

    【讨论】:

    • -weak_library /usr/lib/libSystem.B.dylib 添加到“其他链接器标志”会导致它分成两行:-weak_library/usr/lib/libSystem.B.dylib。这是正确的吗?输入时需要特殊字符吗?
    • 对我来说也是这样。这应该不是问题。
    【解决方案2】:

    好的,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 正常工作,最好的方法似乎如下:

    1. 将 libSystem.B.dylib 添加到 Build Phases 中的 Link With Libraries 作为 OPTIONAL(这相当于添加另一个链接器标志 -weak_library,但会为您找到正确的文件)。
    2. 创建从 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

    【讨论】:

    • 完美!非常感谢托尼。我需要这个作为解释,而不是其他人给出的简单解决方法
    • 刚升级到4.5.2,同样的事情又发生了!
    【解决方案3】:

    这是我的 Xcode 4.0.2 与 SDK 4.3 环境的解决方案,但我相信它也应该适用于其他设置。

    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 在 Simulator 下不起作用,但我认为 Flurry 可以. libSystem.B.dylib 也可能是您项目中包含的其他库所必需的。

    【讨论】:

    • 我同意这个解决方案。我在下面发布了更详细的推理。
    【解决方案4】:

    这是我的分步解决方案:

    1. 我从朋友的 MAC (/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib/libSystem.B.dylib) 复制了 libSystem.B.dylib 文件。 !!! xCode 3.2.5 与 4.0 和 4.2 SDK 一起安装在他的 MAC 上。 !!!
    2. 转到:ProjectSettings > Targets > BuildPhases > Link Binary With Libraries > '+'。
    3. '添加其他'。选择复制的 libSystem.B.dylib 文件(您可以在项目包中找到它)
    4. 构建...

    在此之后,我没有收到“找不到 -lSystem.B 的库”错误。

    该应用还可以在 iOS

    这很奇怪,但似乎问题出在本机 libSystem.B.dylib 文件中。 原生 - 我的意思是 xCode 的 4.0.2。

    祝你好运。

    【讨论】:

    • 我假设您已将朋友的 /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/),对吗?
    • 不完全是。我没有替换我自己的(xCode 的 4.0.2)libSystem.B.dylib 文件。我刚刚将此文件复制到项目位置并在单击“添加其他”后选择它。更换也应该有帮助,但我没有尝试这样做。
    • 我想我已经找到了原因和适当的解决方案 - 请查看我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-17
    • 1970-01-01
    • 2012-04-24
    • 2023-03-05
    • 1970-01-01
    • 2016-07-02
    相关资源
    最近更新 更多