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
アドバイスをありがとう!
ベンゴットリーブ氏は昨日、アプリケーション内のどこかでブロックを使用すると、LLVMコンパイラーでビルドしているときに4.0以前のOSでこれと同様のクラッシュが発生することを指摘しました。これを回避するには、Xcodeビルド設定でリンカーフラグ-weak-lSystem
を指定します。
これらの答えのほとんどはXcode 3.xに固有なので、これを修正するために私がしたことをXcode 4.2で共有したいと思っていました。
「リンクバイナリとライブラリ」セクションの「ビルドフェーズ」タブのターゲットの下に、「libSystem.dylib」を追加してオプションにしました。これにより、iOS 3.xおよび5.0デバイスのサポートを維持しながら、iOS 3.xデバイスの問題が修正されました。
Cocos2dライブラリを使用している場合、これを行うためのよりクリーンな方法があります。cocos2dターゲットのデプロイメントターゲットを3.0に設定する必要があります