2011-03-17 21 views
5

Recientemente me actualicé de XCode 3 a 4, y ahora estoy teniendo problemas de compilación con mi proyecto de iPhone. Necesito apoyar versiones anteriores de iOS a 3.1. Con XCode 3.2.5, no tuve problemas construyendo con SDK 4.2, usando un objetivo de implementación iOS de 3.1. También incluí un enlace débil a la biblioteca libSystem.B, que es necesaria para ejecutar la aplicación en versiones anteriores de iOS. Ahora cuando construyo con XCode 4, obtengo el error del enlazador a continuación. El paso de compilación se completa, pero el paso de enlace falla. Si elimino el enlace débil de la biblioteca libSystem.B, la compilación se completa, pero la aplicación falla al iniciarse cuando se ejecuta en iOS 3.1.¿Cómo puedo compilar en XCode 4, para un destino de despliegue de iOS 3.1, usando libSystem.B?

¿Alguien ha encontrado una solución a este problema? ¿Cómo se compila con XCode 4 para ejecutar una versión anterior de iOS?

ld: library not found for -lSystem.B collect2: ld returned 1 exit status Command /Developer/Platforms/iPhoneSimulator.platform/Developer/usr/bin/llvm-gcc-4.2 failed with exit code 1

Respuesta

6

En los valores de creación del proyecto bajo "Otras banderas Linker" añadir lo siguiente:

-weak_library /usr/lib/libSystem.B.dylib

Debe ser automáticamente agregado a su configuración de compilación de destino, pero si no lo es, debe agregarlo también allí.

+0

añadiendo '-weak_library/usr/lib/libSystem.B.dylib' a "Otras banderas enlazador" hace que se divida en dos líneas: '-weak_library' y'/usr/lib/libSystem.B.dylib'. ¿Es correcto? ¿Necesito algún carácter especial al ingresarlo? – matm

+0

Aparece así también para mí. No debería ser un problema. – TrevorL

+0

vea también mi respuesta a continuación. – matm

0

Aquí está mi solución paso a paso:

  1. he copiado de archivos libSystem.B.dylib partir de mi amigo MAC (/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4. 2.sdk/usr/lib/libSystem.B.dylib). !!! xCode 3.2.5 se instaló en su MAC con 4.0 y 4.2 SDK. !!!
  2. Ir a: Configuración de proyectos> Objetivos> Fases de compilación> Enlace binario con bibliotecas> '+'.
  3. 'Agregar otro'. Seleccione el archivo copiado libSystem.B.dylib (se puede localizar en su paquete de proyectos)
  4. Build ...

Después de esto no he tenido 'biblioteca no encontrado para -lSystem.B' error.

También la aplicación se ejecuta de archivos de dispositivos con iOS 4. <

Es muy extraño, pero parece que el problema está dentro del archivo libSystem.B.dylib nativa. Nativo - quiero decir xCode's 4.0.2.

Buena suerte.

+0

Supongo que ha copiado '/ Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS4.2.sdk/usr/lib/libSystem.B.dylib' de un amigo en la misma ubicación en su MAC (es decir'/Desarrollador/Plataformas/iPhoneOS.platform/Desarrollador/SDKs/iPhoneOS4.2.sdk/usr/lib/', ¿es correcto? – matm

+0

No exactamente. No reemplacé mi propio archivo libSystem.B.dylib (xCode's 4.0.2). Acabo de copiar este archivo a la ubicación del proyecto y elegirlo luego de hacer clic en 'Agregar otro'. Reemplazar también debería ayudar, pero no intenté hacer esto. – mnickv31

+0

Creo que he encontrado el motivo y la solución adecuada: mira mi respuesta. – matm

3

Aquí está mi solución para Xcode 4.0.2 con entorno SDK 4.3, pero creo que también debería funcionar en otras configuraciones.

  1. libSystem.B.dylib no está presente bajo /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator4.3.sdk/usr/lib, sin embargo, está presente para inferior SDK versiones (por ejemploiPhoneOS4.2.sdk)
  2. la mayoría de los casos libSystem.B.dylib es sólo un enlace simbólico a libSystem.dylib
  3. por lo que en iPhoneSimulator4.3.sdk/usr/lib he aplicado comando sudo ln -s libSystem.dylib libSystem.B.dylib siguiente y mi simulador de builds comenzó a trabajar de nuevo :)

NOTA:libSystem.B.dylib es usado por Flurry y Urban Airship así que es mejor que no elimine la referencia en el archivo del proyecto (por supuesto, Urban Airship no No trabajo bajo Simulator, pero creo que Flurry sí. libSystem.B.dylib también puede ser requerido por otras bibliotecas que haya incluido en su proyecto.

+0

Estoy de acuerdo con esta solución. He publicado un razonamiento mucho más detallado para esto a continuación. –

4

bien, la opción weak_library es el camino correcto ... aquí están los problemas:

El .B indica una segunda versión de la biblioteca del sistema. Supongo que algunas de las características más nuevas de Obj-C requieren esto (como Blocks) y el uso de bibliotecas que dan compatibilidad con la API para los bloques y que indirectamente hará referencia a la biblioteca del sistema .B. Esto significa que el enlazador dinámico intentará obtener libSystem.B, pero indirectamente (si su código no usa estas características).

Existen dos problemas que compiten: hacer que la aplicación funcione en dispositivos más antiguos y hacer que se cree para el simulador.

Para que se ejecute en teléfonos más antiguos, deberá especificar un enlace débil para libSystem.B. El enlace débil básicamente lo hace para que las bibliotecas antiguas que faltan bits no causen problemas. Con un enlace normal, se requiere el enlazador dinámico para encontrar todos los símbolos que alguna vez se puedan usar. Con un enlace débil, el enlazador permite elementos faltantes. Esto es parte del soporte de Apple para teléfonos más antiguos ... si le falta un símbolo en la biblioteca, no se preocupe.

Desafortunadamente, el simulador 5.1 SDK NO incluye un archivo libSystem.B.dylib, por lo que varias de las soluciones mencionadas anteriormente funcionan ... si pones un archivo en él puedes encontrarlo, al menos ganó morir en la construcción.

Sin embargo, asegúrese de comprender lo que está haciendo cuando crea este archivo. Le está diciendo al vinculador que se vincule en esa biblioteca cuando se ejecuta en el simulador ... por lo tanto, debe tener el arco correcto y debe realizar enlaces cruzados adecuados con otras bibliotecas en los marcos.

Usar /usr/lib/libSystem.B es una mala idea, ya que es una biblioteca OSX, no una iOS. Del mismo modo, el enlace a una biblioteca DEVICE le proporcionará una biblioteca con arco de brazo, que no funcionará en un sim corriendo en el hardware de Intel.

Usar una libSystem.B de un SDK anterior es una mejor idea, y probablemente funcione, pero dado que parece que Apple no sigue sus propios consejos con el control de versiones de la biblioteca (parece que con 5.1 dejaron caer la versión otra vez)), Supongo que esto también causará problemas.

lo tanto, si quieres apoyar a los dispositivos más antiguos, y desea que el SIM para que funcione correctamente, parece que el mejor método es el siguiente:

  1. Añadir libSystem.B.dylib a la vinculación con bibliotecas en Crear Fases como OPCIONAL (esto es equivalente a agregar el otro marcador del enlazador -weak_library, pero encuentra el archivo correcto para usted).
  2. Cree un enlace simbólico de libSystem.dylib en el marco del SIMULADOR de iOS a libSystem.B.

Mi razonamiento es que desde el .B indica un bache en el control de versiones, y desde ios5.x tendrá toda la funcionalidad necesaria en la biblioteca de papeles, debería estar bien para pretender la versión es idéntica a .B la biblioteca sin versión. Con XCode 4.4 (julio de 2012), esto se hace con:

cd /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator5.1.sdk/usr/lib 
sudo ln -s libSystem.dylib libSystem.B.dylib 

En realidad, es probable que sea seguro de usar cualquier cosa que se parece a una biblioteca válida simplemente porque cuando en realidad se ejecuta en iOS 5.x no lo hace actualmente, incluso busque la versión B ... la solución es pasar la fase de enlace para dispositivos más antiguos ... sin embargo, parece que esta solución es más segura que las otras alternativas enumeradas anteriormente.

Algunas referencias cruzadas de interés:

Weak Linking in Frameworks

Developer Tools Weak Linking

+0

¡Perfecto! Muchas gracias Tony. Necesitaba esto como una explicación en lugar de las soluciones simples que otros habían dado – amergin

+0

Acaba de actualizar a 4.5.2 y lo mismo sucedió de nuevo! – amergin

Cuestiones relacionadas