如何使用libSystem.B为iOS 3.1部署目标构建XCode 4?

时间:2011-03-17 22:49:47

标签: ios linker xcode4

我最近从XCode 3升级到了4,现在我的iPhone项目出现了问题。我需要支持旧版本的iOS回3.1。使用XCode 3.2.5,我使用SDK 4.2构建没有问题,使用3.1的iOS部署目标。我还包含了一个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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:4)

好的,weak_library选项是正确的轨道......以下是问题:

.B表示系统库的第二个版本。我猜测一些较新的Obj-C功能需要这个(比如Blocks),并且使用为块提供API支持的库,这将间接引用.B系统库。这意味着动态链接器将尝试引入libSystem.B,但间接引入(如果您的代码不使用这些功能)。

有两个相互竞争的问题:让应用程序在旧设备上运行,并让它为模拟器构建。

要让它在旧款手机上运行,​​您必须为libSystem.B指定弱链接。弱链接基本上使得缺少位的旧库不会导致问题。通过正常链接,动态链接器需要找到可能使用的所有符号。通过弱链接,链接器允许缺少项目。这是Apple对旧款手机支持的一部分......如果它缺少图书馆中的符号,请不要担心。

不幸的是,5.1模拟器SDK不包含libSystem.B.dylib文件,这就是为什么上面的几个解决方案的工作......如果你把文件放在里面就可以找到,至少赢得了'在建造时死亡。

但是,请确保您在制作此文件时了解自己在做什么。在模拟器上运行时,您告诉链接器链接到该库中...因此,它必须具有正确的arch,并且必须与框架中的其他库正确交叉链接。

使用/usr/lib/libSystem.B是一个坏主意,因为它是一个OSX库,而不是iOS库。类似地,链接到DEVICE库将为您提供一个带有arm arch的库,这将无法在intel硬件上运行的sim中运行。

使用较旧的SDK中的libSystem.B是一个更好的主意,并且可能会有效,但考虑到Apple看起来没有遵循它自己的库版本控制建议(看起来像5.1,他们再次删除了版本) ,我猜这也会引起问题。

因此,如果您想支持旧设备,并且希望SIM能够正常工作,那么最佳方法似乎如下:

  1. 将libSystem.B.dylib添加到与构建阶段中的库链接为可选(这相当于添加其他链接器标志-weak_library,但为您找到正确的文件)。
  2. 从iOS SIMULATOR框架中的libSystem.dylib创建sym链接到libSystem.B。
  3. 我的理由是,由于.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

答案 2 :(得分: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. 的符号链接
  4. 所以 iPhoneSimulator4.3.sdk/usr/lib 我已经应用了以下命令sudo ln -s libSystem.dylib libSystem.B.dylib和我的模拟器 构建开始再次工作:)
  5. 注意: libSystem.B.dylib由Flurry和Urban Airship使用,因此您最好不要删除项目文件中的引用(当然Urban Airship在Simulator下不起作用,但我认为Flurry确实。您在项目中包含的其他库也可能需要libSystem.B.dylib

答案 3 :(得分:0)

以下是我的逐步解决方案:

  1. 我从我朋友的MAC(/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib/libSystem.B.dylib)复制了libSystem.B.dylib文件。 ! xCode 3.2.5安装在他的MAC上,带有4.0和4.2 SDK。 !!!
  2. 转到:ProjectSettings>目标> BuildPhases> Link Binary with Libraries> '+'。
  3. '添加其他'。选择复制的libSystem.B.dylib文件(您可以在项目包中找到它)
  4. 构建...
  5. 在此之后我没有找到'找不到-lSystem.B的库'错误。

    此外,该应用程序在iOS<的设备上运行文件4。

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

    祝你好运。