ios - ¿Cómo actualizar nuestra arquitectura de biblioteca estática para apoyar arm64 Build?
ios7 static-libraries (4)
Ayer también me encontré con el mismo problema y, después de buscar en Google y probar diferentes soluciones, me di por vencido y probé por mi cuenta. Todo lo que pude entender de las diferentes soluciones provistas fue que cuando ejecutaba "lipo -info library.a" no estaba diseñado para la arquitectura x86_64. Por lo tanto, decidió abandonar el enfoque agregado e hizo un intento simple.
- Como se recomienda en este post, agregué armv7, armv7s y arm64 a las arquitecturas.
- construir el proyecto de biblioteca estática con simulador de iphone (32 bits)
- construir el proyecto de biblioteca estática con simulador de iphone (64 bits)
- construir el proyecto de biblioteca estática con dispositivo iOS
- ir a la ruta de compilación (bajo datos derivados)
- Copiado tanto el simulador como la salida del dispositivo a una carpeta común.
- usé el comando lipo en la ventana de la terminal para crear la biblioteca universal
comando lipo: lipo -create -output newlibraryname.a simulatorlibraryname.a devicelibraryname.a
Integró la biblioteca estática universal recién creada y FUNCIONA !!!
Hace unos días creo una biblioteca estática (Universal) que funciona bien con Xcode5.0 SDK7
. Después de la actualización Xcode5.1
con SDK7.1
eso no funciona si selecciono el simulador de iPhone Retina(4-inch 64-bit)
. Luego voy a actualizar mi lib con el cambio de configuración de Bellow.
Hago lo mismo para tres Target: -
Para el simulador deportivo, así como para el dispositivo, puse Universal lib y en este script de ejecución: -
Después de esto i Build Again lib y utilicé como lo hice antes en mi proyecto. Pero sigue teniendo el mismo problema con los Undefined symbols for architecture x86_64:
iPhone Retina(4-inch 64-bit)
Undefined symbols for architecture x86_64:
Entonces, mi pregunta es si hay algún cambio adicional requerido para actualizar lib para arm64 o arm64 algún error en el paso anterior. Por favor actualizeme si estoy equivocado
¿Qué cambio se necesita para actualizar mi biblioteca estática para 64Bit architecture
NOTA:
Estoy pidiendo mi propia actualización de la biblioteca creada. No estoy usando la biblioteca de terceros. Actualizar
Utilicé este lipo -info testingLibImport/libLibNSlog.a
en mi Terminal que la salida es:
Architectures in the fat file: testingLibImport/libLibNSlog.a are: armv7 armv7s i386 arm64
Después de un montón de cosas tengo solución. algunos de xcode no saben que aparecen Standard architectures (including 64-bit) (armv7,armv7s,arm64)
automáticas Standard architectures (including 64-bit) (armv7,armv7s,arm64)
pero en mi caso no hay opción en mi Proyecto de biblioteca estática . Así que voy a agregar esto Manualmente como: -
y seleccione esta opción: -
Después de esto, reconstruí mi biblioteca estática y la utilicé en mi proyecto que funciona bien ahora. y también verifiqué con el comando lipo en la terminal que la salida iba a ser diferente ahora:
testingLibImport / libLibNSlog.a son: armv7 armv7s i386 x86_64 arm64
Lo siento por publicar otra solución tan tarde. Hace mucho tiempo que encontré esta solución cuando intentaba encontrar una solución que me salvara del trabajo manual de crear una biblioteca universal usando el comando lipo cada vez que tenía que construir la biblioteca universal.
Entonces, aquí está el otro enfoque, para aquellos que utilizan el enfoque agregado para construir la biblioteca universal
simplemente haga un pequeño cambio como se menciona a continuación en su script agregado para que el simulador construya la biblioteca universal -
xcodebuild -target ProductName -configuration $ {CONFIGURATION} -dk iphonesimulator ARCHS = "i386 x86_64" BUILD_DIR = "$ {BUILD_DIR}" BUILD_ROOT = "$ {BUILD_ROOT}" SYMROOT = "$ {SYMROOT}"
Observe la inclusión de múltiples arquitecturas en lugar de utilizar un enfoque de arquitectura única:
xcodebuild -target ProductName -configuration $ {CONFIGURATION} -dk iphonesimulator -arch i386 BUILD_DIR = "$ {BUILD_DIR}" BUILD_ROOT = "$ {BUILD_ROOT}" SYMROOT = "$ {SYMROOT}"
Solo ARCHS = "i386 x86_64" hará la magia por ti.
Puede confirmar esto utilizando el siguiente comando lipo lipo -info newLibraryName.a
Espero que esto ahorre tiempo para muchos otros como yo !!!
Otra solución que encontré con XCode 6.4 es agregar ONLY_ACTIVE_ARCH = NO y no especificar la arquitectura. Asi que
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
Construirá arquitecturas i386 y x86_64 en su biblioteca.
Aquí está mi script de ejecución universal de lib completo para construir todas las arquitecturas.
# define output folder environment variable
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# Step 1. Build Device and Simulator versions
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
xcodebuild -target TargetName ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}"
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Step 2. Create universal binary file using lipo
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/lib${PROJECT_NAME}.a" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/lib${PROJECT_NAME}.a"
# Last touch. copy the header files. Just for convenience
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/include" "${UNIVERSAL_OUTPUTFOLDER}/"