iOS 4应用程序在iOS 3.1.3上启动时崩溃:未find符号:__NSConcreteStackBlock

我使用iOS 4.0 SDK运行Xcode 3.2.3。 我使用Base SDK = iphoneos4.0,Active SDK = iphoneos4.0,Deployment Target = 3.1.3和Architecture = standard(arm6 arm7)构build了我的应用程序。 Compiler = GCC 4.2。 据我所知,这是为iOS 4和3 构build应用程序的正确方法。

该应用在运行iOS 4的设备上运行良好。但是,当您尝试在装有iOS 3.1.3(iPod Touch 1G)的设备上运行时,它会在启动时崩溃:

dyld: Symbol not found: __NSConcreteStackBlock Referenced from: /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp Expected in: /usr/lib/libSystem.B.dylib 

这似乎是一个相当“低级别”dynamic链接库的问题,在我的main()函数甚至被调用之前。 我甚至尝试重新启动设备等,没有运气。 这是崩溃日志的一部分:

 Process: MyApp [60] Path: /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp Identifier: MyApp Version: ??? (???) Code Type: ARM (Native) Parent Process: launchd [1] Date/Time: 2010-07-22 17:16:17.942 -0400 OS Version: iPhone OS 3.1.3 (7E18) Report Version: 104 Exception Type: EXC_BREAKPOINT (SIGTRAP) Exception Codes: 0x00000001, 0xe7ffdefe Crashed Thread: 0 Dyld Error Message: Symbol not found: __NSConcreteStackBlock Referenced from: /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp Expected in: /usr/lib/libSystem.B.dylib Dyld Version: 149 Binary Images: 0x1000 - 0x80fff +MyApp armv6 <d5f0ff6f233b4b034c222c16438c88d9> /var/mobile/Applications/192B30ED-16AC-431E-B0E9-67C1F41FD5DA/MyApp.app/MyApp 0x2fe00000 - 0x2fe26fff dyld armv6 <544395a4b5546114b878d5131a84fd7f> /usr/lib/dyld 0x30410000 - 0x30536fff libSystem.B.dylib armv6 <0373fd64e915a17160732b29d343f95f> /usr/lib/libSystem.B.dylib 

感谢您的任何build议!

Ben Gottlieb昨天指出,如果你在你的应用程序中的任何地方使用块,那么在使用LLVM编译器构build时,在4.0之前的操作系统中会看到与此类似的崩溃。 要解决这个问题,你可以在你的Xcode构build设置中指定连接器标志-weak-lSystem

由于这些答案大部分是针对Xcode 3.x的,只是想分享一下我用Xcode 4.2来解决这个问题。

在“Link Binary With Libraries”部分的“Build Phases”选项卡下的目标下,我添加了“libSystem.dylib”并使其成为可选项。 这固定了iOS 3.x设备的问题,同时保持对iOS 4.x和5.0设备的支持。

如果你碰巧使用的是cocos2d库,有一个更简洁的方法来完成这个工作,你应该把cocos2d目标的Deployment目标configuration为3.0