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

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

有没有人find解决这个问题? 如何使用XCode 4构build,在旧版本的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

在“Other Linker Flags”下的项目构build设置中添加以下内容:

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

它应该自动添加到您的目标构build设置,但如果不是,你应该在那里添加它。

好的,weak_library选项是正确的轨道…这里是问题:

.B表示系统库的第二个版本。 我猜一些新的Obj-Cfunction需要这个(如块),并使用库提供的API支持块等将间接引用.B系统库。 这意味着dynamic链接器将尝试拉入libSystem.B,但间接(如果您的代码不使用这些function)。

有两个相互矛盾的问题:让应用程序在较旧的设备上工作,并让它为模拟器构build。

为了让它在旧手机上运行,​​你必须为libSystem.B指定一个弱链接。 弱链接基本上使得它如此旧的库缺less位不会导致问题。 在正常的链接中,dynamic链接器需要find所有可以使用的符号。 由于链接器很弱,链接器允许丢失项目。 这是苹果公司对老手机支持的一部分…如果它在图书馆中缺less一个符号,请不要担心。

不幸的是,5.1模拟器的SDK不包含一个libSystem.B.dylib文件,这就是为什么上面的几个解决scheme的工作…如果你把一个文件放在它可以find,它至less不会死build立。

但是,确保你理解你在做这个文件的时候正在做什么。 在模拟器上运行时,你要告诉链接器链接到该库中,因此它必须具有正确的链接,并且必须与框架中的其他库正确地交叉链接。

使用/usr/lib/libSystem.B是一个坏主意,因为这是一个OSX库,而不是一个iOS的。 同样的,链接到一个DEVICE库将会为你带来一个arm arch的库,这个库不会在Intel硬件上运行的sim上运行。

从旧的SDK中使用libSystem.B是一个更好的主意,可能会工作,但鉴于它看起来像苹果没有遵循自己的build议与库版本(它看起来像5.1版,他们再次放弃了版本),我会猜测这也会导致问题。

所以,如果你想支持较老的设备,并且你希望sim能正常工作,那么最好的方法如下:

  1. 将libSystem.B.dylib添加到在构build阶段中的链接为可选(这相当于添加其他链接器标志-weak_library,但为您find正确的文件)。
  2. 从iOS SIMULATOR框架中的libSystem.dylib创build一个sym链接到libSystem.B。

我的推理是,因为.B表示版本控制中的一个颠簸,而且由于ios5.x将具有股票库中所有需要的function,因此假定.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版本….解决方法是通过旧版链接阶段设备…然而,似乎这个修复比上面列出的其他替代scheme更安全。

一些利益的交叉引用:

框架中的弱连接

开发工具弱连接

这里是我的解决scheme与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.B.dylib的符号链接
  3. 所以在iPhoneSimulator4.3.sdk/usr/lib我已经应用以下命令sudo ln -s libSystem.dylib libSystem.B.dylib和我的模拟器版本开始工作了:)

注意: Flurry和Urban Airship使用libSystem.B.dylib ,所以你最好不要删除项目文件中的引用(当然,在Simulator下,Urban Airship不起作用,但是我认为Flurry可以libSystem.B.dylib也可以被您包括到您项目中的其他图书馆所需要。

这是我的一步一步的解决scheme:

  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>链接二进制与库>“+”。
  3. “添加其他”。 select复制的libSystem.B.dylib文件(您可以在您的项目包中find它)
  4. build立…

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

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

这是非常奇怪的,但似乎问题是在本地libSystem.B.dylib文件。 本机 – 我的意思是xCode的4.0.2。

祝你好运。