我最近从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
答案 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能够正常工作,那么最佳方法似乎如下:
我的理由是,由于.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版本....解决方法是通过链接旧设备的阶段......然而,看起来这个修复比上面列出的其他替代方案更安全。
一些感兴趣的交叉引用:
答案 2 :(得分:3)
这是我使用SDK 4.3环境的Xcode 4.0.2的解决方案,但我相信它也适用于其他设置。
libSystem.B.dylib
不存在
下
/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib
,
但它适用于较低的SDK
版本(例如iPhoneOS4.2.sdk
)libSystem.B.dylib
只是一个
libSystem.dylib
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
。
答案 3 :(得分:0)
以下是我的逐步解决方案:
在此之后我没有找到'找不到-lSystem.B的库'错误。
此外,该应用程序在iOS<的设备上运行文件4。
这很奇怪,但似乎问题出在本机libSystem.B.dylib文件中。 Native - 我的意思是xCode的4.0.2。
祝你好运。