Parece que podemos, teóricamente, construir una biblioteca estática única que incluye simulador y iPhone y iPad.
Sin embargo, Apple no tiene documentación sobre esto que pueda encontrar, y las plantillas predeterminadas de Xcode NO están configuradas para hacerlo.
Estoy buscando una técnica simple, portátil y reutilizable que se pueda hacer dentro de Xcode.
Algo de historia:
- En 2008, solíamos poder crear bibliotecas estáticas individuales que incluían tanto sim como dispositivo. Apple deshabilitó eso.
- A lo largo de 2009, hicimos pares de bibliotecas estáticas: una para sim, otra para dispositivo. Apple ahora también lo ha desactivado.
Referencias
Esta es una gran idea, es un enfoque excelente, pero no funciona: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Hay algunos errores en su secuencia de comandos que significa que solo funciona en su máquina: debería usar BUILT_PRODUCTS_DIR y / o BUILD_DIR en lugar de "estimarlos".
- El último Xcode de Apple le impide hacer lo que ha hecho: simplemente no funcionará, debido al cambio (Documentado) en la forma en que Xcode procesa los objetivos)
Otro interrogador de SO preguntó cómo hacerlo SIN xcode, y con respuestas que se centraron en la parte arm6 vs arm7, pero ignoró la parte i386: ¿Cómo compilo una biblioteca estática (fat) para armv6, armv7 e i386?
- Desde los últimos cambios de Apple, la parte del simulador ya no es la misma que la diferencia arm6 / arm7: es un problema diferente, ver arriba)
Respuestas:
ALTERNATIVAS:
Copiar / pegar fácilmente la última versión (pero las instrucciones de instalación pueden cambiar, ¡vea a continuación!)
La biblioteca de Karl requiere mucho más esfuerzo para la configuración, pero una solución mucho mejor a largo plazo (convierte su biblioteca en un Framework).
Use esto, luego modifíquelo para agregar soporte para las compilaciones de archivo : consulte el comentario de @ Frederik a continuación sobre los cambios que está utilizando para que esto funcione bien con el modo Archivo.
CAMBIOS RECIENTES: 1. Soporte agregado para iOS 10.x (mientras se mantiene el soporte para plataformas más antiguas)
Información sobre cómo usar esta secuencia de comandos con un proyecto incrustado en otro proyecto (aunque recomiendo NO hacerlo nunca, Apple tiene un par de errores que evitan el show en Xcode si incrusta proyectos dentro de otro, desde Xcode 3.x hasta Xcode 4.6.x)
Secuencia de comandos de bonificación para permitirle incluir paquetes automáticamente (es decir, incluir archivos PNG, archivos PLIST, etc. de su biblioteca). Consulte a continuación (desplácese hacia abajo)
ahora es compatible con iPhone5 (usando la solución de Apple para los errores en lipo). NOTA: las instrucciones de instalación han cambiado (probablemente pueda simplificar esto cambiando el script en el futuro, pero no quiero arriesgarlo ahora)
La sección "copiar encabezados" ahora respeta la configuración de compilación para la ubicación de los encabezados públicos (cortesía de Frederik Wallner)
Se agregó la configuración explícita de SYMROOT (¿tal vez necesite OBJROOT para configurarse también?), Gracias a Doug Dickinson
SCRIPT (esto es lo que tienes que copiar / pegar)
Para las instrucciones de uso / instalación, ver abajo
INSTRUCCIONES DE INSTALACIÓN
... BONO OPCIONAL uso:
Si no puede encontrar el archivo de salida, aquí hay una solución alternativa:
Agregue el siguiente código al final del guión (cortesía de Frederik Wallner): abra "$ {CREATING_UNIVERSAL_DIR}"
Apple elimina toda la salida después de 200 líneas. Seleccione su Destino, y en la Fase de Ejecutar Script, DEBE desmarcar: "Mostrar variables de entorno en el registro de compilación"
si está utilizando un directorio personalizado de "salida de compilación" para XCode4, entonces XCode coloca todos sus archivos "inesperados" en el lugar incorrecto.
... esa es la ubicación de su Construcción Universal.
Cómo incluir archivos "sin código fuente" en su proyecto (PNG, PLIST, XML, etc.)
Script para copiar automáticamente los paquetes integrados en la misma carpeta que su biblioteca estática FAT:
fuente
He pasado muchas horas tratando de construir una biblioteca estática que funcione en armv7, armv7s y el simulador. Finalmente encontré una solución .
La esencia es construir las dos bibliotecas (una para el dispositivo y luego otra para el simulador) por separado, renombrarlas para distinguirlas y luego crearlas en una biblioteca.
Lo probé y funciona!
fuente
He creado una plantilla de proyecto XCode 4 que le permite crear un marco universal tan fácilmente como crear una biblioteca normal.
fuente
Hay una utilidad de línea de comandos
xcodebuild
y puede ejecutar el comando de shell dentro de xcode. Por lo tanto, si no le importa usar un script personalizado, este script puede ayudarlo.Quizás parezca ineficiente (no soy bueno en el script de shell), pero fácil de entender. Configuré un nuevo objetivo ejecutando solo este script. El script está diseñado para la línea de comandos pero no se ha probado en :)
El concepto central es
xcodebuild
ylipo
.Intenté muchas configuraciones dentro de Xcode UI, pero nada funcionó. Debido a que este es un tipo de procesamiento por lotes, el diseño de línea de comandos es más adecuado, por lo que Apple eliminó gradualmente la función de construcción por lotes de Xcode. Por lo tanto, no espero que ofrezcan la función de creación de lotes basada en la interfaz de usuario en el futuro.
fuente
Necesitaba una lib estática para JsonKit, así que creé un proyecto de lib estática en Xcode y luego ejecuté este script bash en el directorio del proyecto. Siempre que haya configurado el proyecto xcode con "Construir configuración activa solamente" desactivado, debe obtener todas las arquitecturas en una sola biblioteca.
fuente
Actualización de iOS 10:
Tuve un problema con la construcción de fatlib con iphoneos10.0 porque la expresión regular en el script solo espera 9.xy menos y devuelve 0.0 para ios 10.0
para arreglar esto solo reemplaza
con
fuente
He convertido esto en una plantilla Xcode 4 , en la misma línea que la plantilla de marco estático de Karl.
Descubrí que la construcción de marcos estáticos (en lugar de bibliotecas estáticas simples) estaba causando bloqueos aleatorios con LLVM, debido a un error aparente en el enlazador, por lo tanto, ¡supongo que las bibliotecas estáticas siguen siendo útiles!
fuente
¡Gran trabajo! Pirateé algo similar, pero tuve que ejecutarlo por separado. Tenerlo solo como parte del proceso de compilación lo hace mucho más simple.
Un artículo de nota. Noté que no copia sobre ninguno de los archivos de inclusión que marca como públicos. He adaptado lo que tenía en mi guión al tuyo y funciona bastante bien. Pegue lo siguiente al final de su secuencia de comandos.
fuente
De hecho, acabo de escribir mi propio guión para este propósito. No usa Xcode. (Se basa en un script similar en el proyecto Gambit Scheme).
Básicamente, ejecuta ./configure y make tres veces (para i386, armv7 y armv7s), y combina cada una de las bibliotecas resultantes en una lib gorda.
fuente