Приложение iOS 4 падает при запуске на iOS 3.1.3: Символ не найден: __NSConcreteStackBlock
Я запускаю Xcode 3.2.3 с iOS 4.0 SDK. Я создал свое приложение с базовым SDK = iphoneos4.0, активным SDK = iphoneos4.0, целью развертывания = 3.1.3 и архитектурой = стандартным (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
Спасибо за любой совет!
Ответы
Ответ 1
Бен Готлиб вчера заметил, что если вы используете блоки в любом месте своего приложения, вы увидите крах, похожий на это, на ОС до 4.0 при создании с помощью компилятора LLVM. Чтобы обойти это, вы можете указать флаг компоновщика -weak-lSystem
в настройках сборки Xcode.
Ответ 2
Поскольку большинство этих ответов относятся к Xcode 3.x, просто хотелось поделиться тем, что я сделал, чтобы исправить это с помощью Xcode 4.2.
Под вашей целью на вкладке "Сборка фаз" в разделе "Связывание с библиотеками" я добавил "libSystem.dylib" и сделал это необязательным. Это устранило проблемы iOS 3.x при сохранении поддержки устройств iOS 4.x и 5.0.
Ответ 3
Если вы используете библиотеки cocos2d, есть более чистый способ сделать это, вы должны настроить целевую цель развертывания cocos2d на 3.0