15

? Sé que esta pregunta se ha planteado varias veces, pero mi objetivo es ligeramente diferente con respecto a lo que he encontrado buscando en la web. Específicamente, ya puedo construir una biblioteca estática para iPhone, pero el archivo final de datos que puedo compilar solo contiene las arquitecturas i386 y de brazo (y no estoy seguro de a qué brazo se refiere: ¿es v6 o v7?). No puedo compilar específicamente para armv6 y armv7 y fusionar ambas arquitecturas usando lipo. La herramienta lipo se queja de que la misma arquitectura (arm, no armv6 o armv7) está presente en las bibliotecas armv6 y armv7.¿Cómo compilo una biblioteca estática (grasa) para armv6, armv7 e i386

¿Alguien puede explicar exactamente cómo construir para armv6 y armv7, y fusionar estas bibliotecas en un archivo grueso usando lipo?

EDIT: Necesito construir no usando Xcode pero compilando directamente una biblioteca Unix tradicional.

Respuesta

7

sólo tiene que utilizar libtool para unir las dos versiones ARM6 y ARM7 juntos - su XCode lo hace. Sin embargo, tendrá problemas si intenta combinar estas bibliotecas estáticas en una nueva súper biblioteca. Si necesita hacerlo, lea this.

Si ya está haciendo esto, es por eso que lipo se queja de que su biblioteca "armv6" contiene tanto armv6 como armv7. Mi publicación tiene una solución que probablemente sea más fácil para ti ya que no usas XCode, pero básicamente usas lipo -extract para asegurarte de tener una biblioteca delgada de armv6 y una biblioteca delgada de armv7 antes de seguir adelante.

2

Asegúrese de tener su configuración de compilación establecida en Valid Architectures: armv6 armv7 y Architectures: Optimized (armv6 armv7). Esto debería dar como resultado un binario optimizado para ambos v6 & v7. Si no está seguro de que funcionó, simplemente configure Architectures: Standard (armv6) y compare los tamaños de los archivos. Optimizado debería producir el doble de tamaño (cuando recuerdo correctamente).

También puede usar siempre lipo -info en su binario para ver todos los architecures incluidos.

ejecutarlo en una acumulación distribución de mi aplicación me da:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

Lo siento, me olvidé de mencionar que necesito construir esto sin usar Xcode pero compilando directamente una biblioteca de Unix tradicional. Estoy editando mi respuesta para reflejar este hecho. –

2

Parece que no es necesario extraer de la biblioteca de grasas antes de volver a unirse (como se describe en la respuesta de jamie). Estoy usando el SDK 4.0 final de apple, que parece crear las bibliotecas fat armv6/armv7 de forma predeterminada.

estaba especificando previamente la arquitectura para el lib entrada de este modo:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Esta falla en el SDK posteriores, pero la eliminación de la arquitectura de la (ahora grasa) brazo lib funciona bien:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Lipo ahora debe ser capaz de detectar las arquitecturas en las bibliotecas de grasa.

10

Aquí es una buena solución que encontré: Static Libs With Support to iOS 5 and Arm64

Editado:

La solución es construir diferentes arquitecturas separadas luego atarlos usando lipo, mediante el uso de línea de comandos (o Rakefile).

En primer lugar construir el binario con brazo utilizando xcodebuild:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

Tenga en cuenta que debe configurar IPHONEOS_DEPLOYMENT_TARGET = '5.0' y ARCHS = 'armv7s ARMv7', se recomienda establecer la estructura y de productos directorios para hacer las cosas más claro, eche un vistazo a la Referencia de configuración de compilación para más detalles sobre lo que significa esta bandera.

Ejecución siguiente para arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

Nota la diferencia en arcos y IPHONEOS_DEPLOYMENT_TARGET. También tenemos que construir para el simulador, en este caso tenemos que cambiar el SDK para iphonesimulator7.0 y construir en dos etapas, primero para i386:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

Ahora la parte difícil! Si simplemente cambia ARCHS a x86_86 según su configuración de Xcode, obtendrá un error como: "x86_64 no es un arco válido". Para evitar esto basta con añadir VALID_ARCHS = 'x86_64':

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

Finalmente sólo tenemos que crear un binario de grasa con todos los 5 arquitecturas:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

El autor crea un ejemplo práctico de esto, puede conseguirlo: https://github.com/diogot/StaticLibDemo


Aquí está el enlace a la publicación: Static Libs With Support to iOS 5 and Arm64

Todos los créditos van a Diogo Tridapalli.

+0

¡Gracias por decirme! @kleopatra – Yang

+0

Gracias por los créditos @yang! –

Cuestiones relacionadas