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:
- 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).
- 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
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
Aparece así también para mí. No debería ser un problema. – TrevorL
vea también mi respuesta a continuación. – matm