2010-07-22 44 views
46

Estoy ejecutando Xcode 3.2.3 con iOS 4.0 SDK. Creé mi aplicación con Base SDK = iphoneos4.0, SDK activo = iphoneos4.0, Target de despliegue = 3.1.3 y Architecture = estándar (arm6 arm7). Compilador = GCC 4.2. Según tengo entendido, esta es la forma correcta de compilar una aplicación para iOS 4 y 3.iOS 4 la aplicación se bloquea al iniciar en iOS 3.1.3: Símbolo no encontrado: __NSConcreteStackBlock

La aplicación funciona bien en dispositivos con iOS 4. Pero se bloquea al iniciar cuando intentas ejecutarla en una dispositivo con iOS 3.1.3 (un 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 

parece ser un problema con una biblioteca bastante "bajo nivel" vinculado dinámicamente, antes de que mi función main(), incluso se llama. Incluso he intentado reiniciar el dispositivo, etc., sin suerte. Aquí está parte del registro de fallas:

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 

¡Gracias por cualquier consejo!

+1

¿Está utilizando alguno de los frameworks solo iOS4 (deberían estar débilmente vinculados)? – christo16

+0

No, no es que yo sepa. De hecho, la última vez que se creó y probó la aplicación fue con SDK 3 y un dispositivo 3.1.3, incluso antes de que se lanzara iOS 4. No he cambiado ninguno de los códigos o librerías desde entonces. Estoy intentando compilar con SDK 4 por primera vez y probar con iOS 4 + iOS 3.x. –

Respuesta

85

Ben Gottlieb señaló ayer que si utiliza bloques en cualquier lugar de su aplicación, verá un bloqueo similar a este en un sistema operativo anterior a 4.0 mientras construye con el compilador LLVM. Para solucionar esto, puede especificar el indicador del enlazador -weak-lSystem en la configuración de compilación de Xcode.

+16

¡Ah, gracias Brad! Estaba volviendo para compartir la misma solución (después de un poco de prueba y error) ... Para cualquier otra persona que pueda encontrar esto y necesite ayuda para configurar el enlace débil, aquí hay una captura de pantalla: http://img.skitch.com /20100722-f65bkarx79gk8nye52ji834cbn.png Además, tenga en cuenta que no parece ser específico del compilador de LLVM: solo estoy usando GCC 4.2. –

+1

@Clint Harris - Creo que para el compilador LLVM aún necesita forzar la vinculación débil utilizando el indicador del compilador, porque no respeta la configuración dentro de la ventana de proyecto de Xcode. –

+0

¿Qué significa "bloquear" en este contexto? Bloquear para mí significa un bloque de código, que supongo que no es lo que quieres decir aquí. Esta solución me arregló también por cierto. ¡Muchas gracias! – quano

1

Si sucede utilizar las bibliotecas Cocos2d, hay una forma más limpia de hacer esto, usted debe configurar destino del despliegue del objetivo cocos2d a 3,0

+0

¿Tienes idea de cómo lidiar con él en las plantillas de XCode 4? Gracias. – fjlksahfob

18

Dado que la mayoría de estas respuestas son específicas de Xcode 3.x, solo quería compartir lo que hice para arreglar esto con Xcode 4.2.

Debajo de su objetivo en la pestaña "Crear Fases" en la sección "Enlace Binario con Bibliotecas", agregué "libSystem.dylib" y lo hice opcional. Esto solucionó el problema de los dispositivos con iOS 3.x al mismo tiempo que mantiene el soporte para dispositivos iOS 4.xy 5.0.

+0

Muchas gracias. Trabajado como un encanto. De ninguna manera habría encontrado una solución a ese error críptico sin esta ayuda. – CuriousMarc

Cuestiones relacionadas