Cree una biblioteca estática (dispositivo + simulador) con Xcode y SDK 4+


283

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

  1. 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)
  2. 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)

Solo me preguntaba: ¿por qué querrías eso? ¿No hace que la biblioteca de dispositivos sea más grande y pesada en el dispositivo?
cregox

3
@Cawas: el "peso" de la biblioteca es irrelevante en el 95% de las situaciones del mundo real; para la mayoría de nosotros, las bibliotecas son pequeñas, especialmente en comparación con, por ejemplo, mostrar solo un solo UIImageView.
Adam

1
@Cawas: mientras tanto, el valor aquí es que hace que sea MUCHO más fácil para otras personas usar / reutilizar su biblioteca. Se convierte en un proceso de arrastrar / soltar de una etapa.
Adam

44
@Cawas: finalmente, un beneficio sorprendentemente valioso: es muy fácil enviar accidentalmente a alguien la biblioteca compilada "incorrecta": XCode no realiza comprobaciones y compilará felizmente la arquitectura "incorrecta" en el archivo con el nombre que creía que era "correcto" arquitectura. Manzana sigue rompiendo Xcode en esta área - cada nueva versión tiene cambios que significan "el botón que pulsó ayer para compilar su lib bien proyectada hoy compilación de forma incorrecta". Hasta que Apple deje de fastidiarnos, tenemos que hacer una prueba idiota de su mala interfaz de usuario :).
Adam

1
¡Eso sería realmente genial! Porque en este momento, no podemos confiar en el simulador para algo un poco más complejo.
cregox

Respuestas:


272

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)

  1. 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)

  2. 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)

  3. 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)

  4. 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)

  5. 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

##########################################
#
# c.f. /programming/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.82
#
# Latest Change:
# - MORE tweaks to get the iOS 10+ and 9- working
# - Support iOS 10+
# - Corrected typo for iOS 1-10+ (thanks @stuikomma)
# 
# Purpose:
#   Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#

set -e
set -o pipefail

#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"

if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi

#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
#    (incidental: searching for substrings in sh is a nightmare! Sob)

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')

# Next, work out if we're in SIM or DEVICE

if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi

echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################

#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"

echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\"

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

ACTION="build"

#Merge all platform binaries as a fat binary for each configurations.

# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator

echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"

CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"

# ... remove the products of previous runs of this script
#      NB: this directory is ONLY created by this script - it should be safe to delete!

rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"

#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

#########
#
# Added: StackOverflow suggestion to also copy "include" files
#    (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo "  (if you embed your library project in another project, you will need to add"
echo "   a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo '        "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi

INSTRUCCIONES DE INSTALACIÓN

  1. Crear un proyecto lib estático
  2. Seleccione el objetivo
  3. En la pestaña "Configuración de compilación", configure "Construir solo arquitectura activa" en "NO" (para todos los elementos)
  4. En la pestaña "Fases de compilación", seleccione "Agregar ... Nueva fase de compilación ... Nueva fase de compilación de script de ejecución"
  5. Copie / pegue el script (arriba) en el cuadro

... BONO OPCIONAL uso:

  1. OPCIONAL: si tiene encabezados en su biblioteca, agréguelos a la fase "Copiar encabezados"
  2. OPCIONAL: ... y arrástrelos / suéltelos desde la sección "Proyecto" a la sección "Público"
  3. OPCIONAL: ... y se exportarán AUTOMÁTICAMENTE cada vez que construya la aplicación, en un subdirectorio del directorio "debug-universal" (estarán en usr / local / include)
  4. OPCIONAL: NOTA: si también intenta arrastrar / soltar su proyecto en otro proyecto Xcode, esto expone un error en Xcode 4, donde no puede crear un archivo .IPA si tiene encabezados públicos en su proyecto de arrastrar / soltar. La solución: no incrustar proyectos de xcode (¡demasiados errores en el código de Apple!)

Si no puede encontrar el archivo de salida, aquí hay una solución alternativa:

  1. Agregue el siguiente código al final del guión (cortesía de Frederik Wallner): abra "$ {CREATING_UNIVERSAL_DIR}"

  2. 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"

  3. si está utilizando un directorio personalizado de "salida de compilación" para XCode4, entonces XCode coloca todos sus archivos "inesperados" en el lugar incorrecto.

    1. Construye el proyecto
    2. Haga clic en el último icono a la derecha, en el área superior izquierda de Xcode4.
    3. Seleccione el elemento superior (esta es su "compilación más reciente". Apple debería seleccionarlo automáticamente, pero no pensaron en eso)
    4. en la ventana principal, desplácese hacia abajo. La última línea debería leer: lipo: para la configuración actual (depuración) creando el archivo de salida: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... 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.)

  1. Haz todo lo anterior, verifica que funcione
  2. Cree una nueva fase Ejecutar script que viene DESPUÉS DE LA PRIMERA (copie / pegue el código a continuación)
  3. Cree un nuevo destino en Xcode, de tipo "paquete"
  4. En su PROYECTO PRINCIPAL, en "Fases de compilación", agregue el nuevo paquete como algo de lo que "depende" (sección superior, presione el botón más, desplácese hacia abajo, busque el archivo ".bundle" en sus Productos)
  5. En su NUEVO OBJETIVO DE PAQUETE, en "Fases de compilación", agregue una sección "Copiar recursos de paquete" y arrastre / suelte todos los archivos PNG, etc.

Script para copiar automáticamente los paquetes integrados en la misma carpeta que su biblioteca estática FAT:

echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"

2
He usado esto en algunos proyectos ahora, y envié cosas a la tienda de aplicaciones que usaron esto para construir las bibliotecas. Todo funcionó 100% bien, así que me quedo con esto por ahora (hasta Xcode 4, tal vez)
Adam

2
¿Alguien puede confirmar si este método funciona para XCode 4.5? Estoy tratando de compilar una biblioteca estática y usarla en mi proyecto principal. Puedo ejecutar esto en el dispositivo pero no en el simulador. Este es el error que obtengo: falta la arquitectura requerida i386 en el archivo /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 cortes)
Alex1987

2
¿Alguna idea de cómo hacer que esto funcione con XCode 5 y ARM64? Si dejo las arquitecturas como estándar, hace que la biblioteca con armv7, armvs7 e i386 como se esperaba. Si configuro arquitecturas a estándar incluyendo 64 bits, entonces la biblioteca solo contiene "cputype 16777223". Uso otool -h en el archivo .a para verificar lo que hay dentro
Roger Binns

1
XCode5 ha hecho que agregar una fase de compilación de script de ejecución sea aún más complicado. mira
Fabio Napodano

1
Esto parece funcionar bien en Xcode 6 sin cambios (solo probé un par de proyectos hasta el momento, y todavía no he enviado ninguna actualización de la App Store, pero todos están funcionando bien hasta ahora).
Adam

85

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.

lipo -create libPhone.a libSimulator.a -output libUniversal.a

Lo probé y funciona!


44
Le sugiero que lea la respuesta aceptada. Es posible que esto ya haya sido cubierto, 2 años antes ...
Adam

2
Lo leí, usé el script, pero no me funcionó para armv7s.
g_low

2
el comando lipo no funciona en el script, ¡pero manualmente funciona muy bien! 10x
Dima

9
+1 Esto fue realmente todo lo que necesitaba, no un gran script "make-a-framework".
LearnCocos2D

Su solución URL devuelve "Error 404 - No encontrado"
Alex

74

He creado una plantilla de proyecto XCode 4 que le permite crear un marco universal tan fácilmente como crear una biblioteca normal.


No se pudo compilar con el objetivo iOS 4.3. Obtenga el siguiente error: destino de implementación no válido para -stdlib = libc ++ (requiere iOS 5.0 o posterior)
Alex1987

Desearía poder dar más puntos de reputación por esta respuesta ... mucho más fácil que usar CMake para crear una biblioteca estática. ¡Muchas gracias por hacer esto!
Fui robado el

También funciona con iOS 6 para mí. Pero tal vez sea porque mi lib es bastante simple y sin dependencias y recursos
Paulius Vindzigelskis

Hay un GRAN problema con esa solución: otros que quieran usar el marco creado por esta solución (esta solución sugiere instalar la plantilla de fremework en xcode) ¡DEBEN instalar esta plantilla en SU ​​xcode!
evya

Solo necesita instalar la plantilla para marcos reales. Los marcos falsos funcionarán bien en Xcode no modificado.
Karl

30

Hay una utilidad de línea de comandos xcodebuildy puede ejecutar el comando de shell dentro de xcode. Por lo tanto, si no le importa usar un script personalizado, este script puede ayudarlo.

#Configurations.
#This script designed for Mac OS X command-line, so does not use Xcode build variables.
#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a

DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2






#Build for all platforms/configurations.

xcodebuild -configuration Debug -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO







#Merge all platform binaries as a fat binary for each configurations.

DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal

RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal

rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}"

lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}" "${DEBUG_DEVICE_DIR}/${FILE_NAME}" "${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}" "${RELEASE_DEVICE_DIR}/${FILE_NAME}" "${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

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 xcodebuildy lipo.

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.


Gracias, es realmente interesante que los comandos simples subyacentes todavía parecen funcionar, es solo que Apple rompió su GUI espectacularmente. Parece que podría hacer una plantilla de proyecto totalmente personalizada que "no apestara" y arreglara las cosas que Apple rompió, haciendo previamente todos los Objetivos y conectando este script con variables de compilación xcode. Lo probaré en mi próximo proyecto :)
Adam

1
Utilicé un script similar a este y lo puse bajo un nuevo objetivo que contiene solo el script de shell. El script de compilación recursivo anterior es muy inteligente, pero innecesariamente confuso.
benzado

1
Prefiero scripts de shell para cosas como esta, aquí está mi gist.github.com/3178578
slf

@benzado Sí, evité la complejidad intencionalmente porque creo que el script de shell debe ser fácil de leer para modificarlo.
Eonil

lipo: no se puede abrir archivo de entrada: / debug-iPhoneOS /
Dima

11

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.

#!/bin/bash
xcodebuild -sdk iphoneos
xcodebuild -sdk iphonesimulator
lipo -create -output libJsonKit.a build/Release-iphoneos/libJsonKit.a build/Release-iphonesimulator/libJsonKit.a

7

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

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$')

con

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')

Gracias. Hice un cambio similar esta mañana, pero usé \ d. Este creo que es el que queremos (¿es mejor o peor que el tuyo?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Adam

Creo que el mío es más confiable ya que solo considera números
ben

1
No, el tuyo coincide con 1 forma particular de escribir dígitos. Dado el soporte histórico de Apple para (y el uso) de caracteres y textos prettificados (por ejemplo, en nombres de archivos), esperaría que su selección de propiedad de unos pocos dígitos sea menos confiable.
Adam

1
Está bien, tal vez tengas razón. al menos el mío también hizo que mi proyecto funcionara y estamos a salvo para las próximas 89 versiones de ios
ben

La solución @ben funciona para mí, la expresión regular de Adam '[\\. 0-9] \ {3,4 \} $' da el código de error 2
Zee

4

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!


Hola Michael, probé tu plantilla de biblioteca estática pero puedo compilar para el simulador pero no para el dispositivo, aquí aparece el error: ** FALLO EN LA CONSTRUCCIÓN ** Los siguientes comandos de compilación fallaron: ProcessPCH / var / folder / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple. ) Mostrando solo los primeros 200 avisos Falló el comando / bin / sh con el código de salida 65
Kappe

2

¡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.

if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
  mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
  cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi

1
OK, lo agregué a la respuesta anterior. (no he tenido la oportunidad de probarlo todavía, pero me parece correcto)
Adam

1

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.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.