iOS 4应用程序在iOS 3.1.3启动时崩溃:未找到符号:__ NSConcreteStackBlock

Cli*_*ris 46 iphone ios4 ios

我正在使用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)构建了我的应用程序.编译器= GCC 4.2.据我了解,这是为iOS 4和3 构建应用程序的正确方法.

该应用程序在运行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
Run Code Online (Sandbox Code Playgroud)

在我的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
Run Code Online (Sandbox Code Playgroud)

谢谢你的建议!

Bra*_*son 85

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

  • 啊,谢谢布拉德!我只是回来共享相同的溶液(一些试验和错误之后)......对于别人谁可能会遇到这样和需要帮助建立的薄弱环节,这里是截图:http://img.skitch.com /20100722-f65bkarx79gk8nye52ji834cbn.png另外,请注意它似乎并不特定于LLVM编译器 - 我只是使用GCC 4.2. (16认同)
  • 这个解决方案工作正常,但我只能在模拟器中获得任何Block使用的即时崩溃.我有条件地仅为非模拟器构建设置此标志./ cc @stigi (2认同)
  • 使用-weak-lSystem可以在3.x设备上运行,但不会使模拟器崩溃.有人应该编辑父帖子. (2认同)

Bra*_*don 18

由于大多数这些答案都是针对Xcode 3.x的,所以我只想分享我用Xcode 4.2解决这个问题的方法.

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