【问题标题】:iOS 4 app crashes at startup on iOS 3.1.3: Symbol not found: __NSConcreteStackBlockiOS 4 应用程序在 iOS 3.1.3 上启动时崩溃:找不到符号:__NSConcreteStackBlock
【发布时间】:2011-03-19 19:58:36
【问题描述】:

我正在运行带有 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

在我的 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

感谢您的建议!

【问题讨论】:

  • 您是否在使用任何仅限 iOS4 的框架(它们应该是弱链接的)?
  • 不,我不知道。事实上,上一次构建和测试应用程序是使用 SDK 3 和 3.1.3 设备——甚至在 iOS 4 发布之前。从那以后我没有更改任何代码或库——我只是第一次尝试使用 SDK 4 构建并在 iOS 4 + iOS 3.x 上进行测试。

标签: iphone ios ios4


【解决方案1】:

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

【讨论】:

  • 啊,谢谢布拉德!我只是回来分享相同的解决方案(经过一些试验和错误)......对于可能遇到此问题并需要帮助设置弱链接的任何其他人,这是一个屏幕截图:img.skitch.com/20100722-f65bkarx79gk8nye52ji834cbn.png 另外,请注意它没有'似乎不是特定于 LLVM 编译器——我只是使用 GCC 4.2。
  • @Clint Harris - 我认为对于 LLVM 编译器,您仍然需要使用编译器标志强制弱链接,因为它不尊重 Xcode 项目窗口中的设置。
  • 这个解决方案首先有效,但没有我得到仅在 3.x 设备上发生的自发崩溃 (EXC_BAD_ACCESS),并且不会在调试器或任何控制台输出中留下任何堆栈。我在同步设备后收到了一份看起来有点可疑的崩溃报告……:gist.github.com/659393(摘录)
  • 这个解决方案工作正常,但我只在模拟器中遇到任何块使用的即时崩溃。我只为非模拟器版本有条件地设置了这个标志。 /cc @stigi
  • 使用 -weak-lSystem 可以在 3.x 设备上运行,但不会使模拟器崩溃。应该有人编辑父帖子。
【解决方案2】:

由于这些答案中的大多数都是针对 Xcode 3.x 的,因此只想分享我为使用 Xcode 4.2 解决此问题所做的工作。

在“将二进制文件与库链接”部分的“构建阶段”选项卡的目标下,我添加了“libSystem.dylib”并将其设为可选。这解决了 iOS 3.x 设备的问题,同时保持了对 iOS 4.x 和 5.0 设备的支持。

【讨论】:

  • 非常感谢。像魅力一样工作。如果没有这个帮助,我不可能找到解决这个神秘错误的方法。
【解决方案3】:

如果你碰巧在使用 cocos2d 库,有一种更简洁的方法可以做到这一点,你应该将 cocos2d 目标的 Deployment 目标配置为 3.0

【讨论】:

  • 您知道如何在 XCode 4 模板上处理它吗?谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-27
  • 1970-01-01
相关资源
最近更新 更多