web-dev-qa-db-ja.com

iOS 3.1.3での起動時にiOS 4アプリがクラッシュする:シンボルが見つかりません:__NSConcreteStackBlock

Xcode 3.2.3をiOS 4.0 SDKで実行しています。私は、Base SDK = iphoneos4.0、Active SDK = iphoneos4.0、Deployment Target = 3.1.3、およびArchitecture = standard(arm6 arm7)でアプリをビルドしました。コンパイラ= GCC 4.2。私が理解しているように、これはbuild 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

アドバイスをありがとう!

46
Clint Harris

ベンゴットリーブ氏は昨日、アプリケーション内のどこかでブロックを使用すると、LLVMコンパイラーでビルドしているときに4.0以前のOSでこれと同様のクラッシュが発生することを指摘しました。これを回避するには、Xcodeビルド設定でリンカーフラグ-weak-lSystemを指定します。

85
Brad Larson

これらの答えのほとんどはXcode 3.xに固有なので、これを修正するために私がしたことをXcode 4.2で共有したいと思っていました。

「リンクバイナリとライブラリ」セクションの「ビルドフェーズ」タブのターゲットの下に、「libSystem.dylib」を追加してオプションにしました。これにより、iOS 3.xおよび5.0デバイスのサポートを維持しながら、iOS 3.xデバイスの問題が修正されました。

18
Brandon

Cocos2dライブラリを使用している場合、これを行うためのよりクリーンな方法があります。cocos2dターゲットのデプロイメントターゲットを3.0に設定する必要があります

1
Rafael Nobre