Biblioteca de iOS a BitCode

8 minutos de lectura

avatar de usuario
pila_tom

Recientemente descargué Xcode 7 beta, y Xcode se queja de que algunas de mis bibliotecas C no se compilan en BitCode. ¿Cómo haría para decirle a Clang que produzca BitCode que sea compatible con iOS? He visto respuestas similares en stackoverflow, pero no sé si se aplican a la producción de bibliotecas BitCode para iOS.

Editar:

Estoy usando la configuración correcta, -fembed-bitcode, pero cuando intento archivar, aparece el error: ld: advertencia: ignorar el archivo XXXX/XXXX, el archivo se creó para el archivo que no es la arquitectura que se vincula (arm64). Cuando uso -fembed-bitcode-marker, puedo archivar, pero aparece el error: no se pudo generar el paquete de código de bits completo porque XX/XX se creó solo con el marcador de código de bits. La biblioteca debe generarse a partir de la compilación del archivo Xcode con bitcode habilitado.

¿Alguna idea sobre lo que está yendo mal? La biblioteca se está compilando correctamente, pero no me permite archivar. Creé una función de agregar simple y la convertí en una biblioteca, y obtengo los mismos síntomas, por lo que no es la biblioteca que estoy compilando.

Edición 2: debe compilar las versiones arm64 y armv7 usando bitcode y lipo juntos. El uso de código de bits no elimina la necesidad de una gran biblioteca al archivar. fuente : Enlace

  • ¿entonces compilas estas bibliotecas C tú mismo?

    – usuario102008

    5 de julio de 2015 a las 21:26

  • Sí, preguntando específicamente sobre gmp. Pero, en general, estoy preguntando, ¿cómo logramos hacer sonar para producir BitCode que funcione con iOS? Sé que hay una opción para hacer que el sonido metálico se detenga en la representación intermedia (IR), pero no sé si esto funcionará con todo el BitCode que Apple está mencionando ahora.

    – stack_tom

    6 de julio de 2015 a las 4:07

avatar de usuario
Danoli3

Al crear bibliotecas estáticas, debe agregar lo siguiente para la generación de códigos de bits:

-fembed-bitcode 

para una biblioteca dinámica, necesita vincularse adicionalmente con

-fembed-bitcode

Nota: este comando solo está disponible con Xcode7+

Con respecto a la respuesta aceptada de usar -fembed-bitcode-marker

Debe tener en cuenta que una compilación normal con la opción -fembed-bitcode-marker producirá secciones de código de bits incrustadas de tamaño mínimo sin ningún contenido real. Esto se hace como una forma de probar los aspectos relacionados con el código de bits de su compilación sin ralentizar el proceso de compilación. El contenido de código de bits real se incluye cuando realiza una compilación de archivo.

Bastón de Apple de bwilson.
https://forums.developer.apple.com/thread/3971#12225


Para ser más especifico:

  • -fembed-bitcode-marker simplemente marca dónde estaría el código de bits en el binario después de la compilación de un archivo.
  • -fembed-bitcode en realidad hace la generación e incrustación completa del código de bits, por lo que esto es lo que necesita usar para crear bibliotecas estáticas.
  • Xcode en sí se construye con -fembed-bitcode-marker para compilaciones regulares (como implementar en el simulador)
  • Xcode solo compila con -fembed-bitcode para compilaciones de archivo / compilaciones de producción (ya que esto solo es necesario para Apple).

  • Gracias por el truco de compilación xcode-select, que es muy útil y no lo sabía. Entonces, si uso -fembed-bitcode, ¿funcionarán las bibliotecas producidas en el simulador? Actualmente tengo que usar las bibliotecas -fembed-bitcode-marker cuando implemento en el dispositivo, pero tengo que usar mis bibliotecas fat compiladas previamente cuando ejecuto en el simulador, de lo contrario recibo errores del enlazador. Además, si uso -fembed-bitcode-marker, ¿Xcode crea las versiones de código de bits de la biblioteca cuando se implementa en el dispositivo, ya que ya no recibo advertencias?

    – stack_tom

    10 de julio de 2015 a las 22:08


  • Bien, he construido usando ese comando. Sin embargo, tengo los mismos síntomas que antes: las bibliotecas gruesas se ejecutan en el simulador, pero las de código de bits fembed no. Además, no puedo archivar. Xcode dice “ld: advertencia: ignorando el archivo X, el archivo se creó para el archivo que no es la arquitectura que se vincula (arm64)”. Cuando uso la biblioteca -fembed-bitcode-marker, me permite archivar, sin embargo, nuevamente recibo las advertencias de código de bits como dijiste (ya que en realidad no es un código de bits). ¿Por qué no puedo archivar con -fembed-bitcode solo entonces? Incluso dice que fue creado para archivar.

    – stack_tom

    10 de julio de 2015 a las 22:44

  • tengo el mismo problema y he probado lo mismo :/

    – Prateek

    10/10/2015 a las 19:31

  • ¿Dónde tengo que insertar esa línea, por favor dígame?

    – Mahesh Narla

    24 de febrero de 2017 a las 7:32

avatar de usuario
Gautam Jain

ir a la Configuración de compilación. Buscar “banderas de compilador personalizadas“.

Agregar -fembed-bitcode para Otras banderas C. Esto asegurará que la lib se construya con compatibilidad de código de bits en el momento de la compilación. Hice esto para iOS de 64 bits y 32 bits, y los fusioné en uno. Funciona de maravilla.

Como ustedes tuvieron consultas, aquí hay una captura de pantalla de la configuración: La configuración es la misma para el objetivo del proyecto y el objetivo del SDK.

ingrese la descripción de la imagen aquí


Bitcode lib no funcionará con Xcode 6.

  • ¿Puede compartir el guión para hacer 64 bits, 32 bits y para el simulador y luego unirlos en uno?

    – Satyam

    8 oct 2015 a las 14:38

  • lipo -create -salida “destino” “fuente1” “fuente2” “fuente 3”. Aquí la fuente 1 es su ruta a la biblioteca del simulador de 32 bits, la “fuente 2” es la ruta a la biblioteca del simulador de 64 bits y la “fuente 3” es la ruta a la “lib del dispositivo iOS”. Esto se hace desde la terminal. Puede verificar los detalles finales de la biblioteca con este comando lipo -info “ruta a la biblioteca final”

    – Gautama Jain

    8 oct 2015 a las 15:06


  • Gracias, quiero el comando de compilación para crear archivos lib de 32 bits y 64 bits

    – Satyam

    8 oct 2015 a las 15:27

  • @GautamJain, estoy usando XCode7.0.1 y agregué Otras banderas C con -fembed-bitcode, Enable Bitcode=YES en la configuración de compilación de destino y luego ejecuté el comando lipo en el dispositivo y las compilaciones del simulador. Además, estoy usando un script de shell para hacer que el dispositivo y el simulador se construyan con las opciones ENABLE_BITCODE=YES y OTHER_CFLAGS=”-fembed-bitcode”. Sin embargo, parece que no tengo suerte con la biblioteca de grasa. El código de bits se elimina de la biblioteca fat y no puedo archivar mi aplicación cuando configuro Habilitar código de bits = SÍ en la configuración de compilación de destino de la aplicación. Estoy confundido por qué lipo elimina las banderas de código de bits.

    -Deepak Badiger

    13/10/2015 a las 14:10

  • “El código de bits se eliminó de la biblioteca de grasa” También estoy viendo esto. Estoy tratando de convencerme de que este es el comportamiento esperado…

    – jmoody

    23/11/2015 a las 20:00

Si aún tiene problemas después de agregar el -fembed-bitcode a las banderas de Otros C, busque “Habilitar código de bits” en “Opciones de compilación” y configúrelo en No. Esto le permitirá archivar correctamente.

  • ¡Usted, señor, es un salvavidas! ¡Gracias!

    – Tash Pemhiwa

    1 de marzo de 2017 a las 18:59

avatar de usuario
Zeeshan

Lo que necesita es -fembed-bitcode. Cuando ENABLE_BITCODE está habilitado, Xcode compila con -fembed-bitcode-marker para compilaciones regulares y con -fembed-bitcode para compilaciones de archivo. Una opción simplemente “marca” dónde estaría el código de bits en el binario después de la compilación de un archivo y hace cumplir las nuevas reglas del código de bits, mientras que la otra en realidad realiza la generación completa del código de bits, que probablemente sea más lenta y, por lo tanto, no esté habilitada en todo tipo de compilación. .

La guía de Syo Ikeda para manejar BITCODE también podría ayudarlo:

1649068214 811 Biblioteca de iOS a BitCode

Puede encontrar la presentación completa de diapositivas aquí.

Si está creando una biblioteca estática y le gustaría habilitar el código de bits, solo (1) ENABLE_BITCODE = YES puede no ser suficiente.

(2) También con el ajuste -fembed-bitcode el siguiente error seguía apareciendo para varios archivos cuando se construía en Teamcity

bitcode bundle could not be generated because ‘/path/fileInYourStaticLib.a(fileInYourStaticLib.o)’ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64

Algunos consejos/cosas a tener en cuenta que me ayudaron a resolver el problema en última instancia, además de los pasos anteriores (1) y (2)

  1. Asegúrese de establecer la variable ‘Otras banderas C’ en “-fembed-bitcode” en el ‘PROYECTO’ y todos los ‘OBJETIVOS’.

  2. Si hay varios proyectos para los que está intentando crear una biblioteca estática, asegúrese de que todos los proyectos tengan "-fembed-bitcode" activado.

  3. On Build Settings, click on the + sign at the top to add a user-defined build setting with the nameBITCODE_GENERATION_MODE, and set Debug tomarcador, Release tocódigo de bits

  4. Si los pasos anteriores no funcionan, también puede probar esta opción. On Build Settings -> Other C flags, set Debug to-fembed-bitcode-marcador, and Release to-fembed-código de bits

Este blog fue de gran ayuda
https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

Además, cada vez que realice los cambios anteriores, intente eliminar DerivedData, limpie el proyecto XCode y, posiblemente, cierre y reinicie XCode.

  • genial, ya no es tan sencillo como establecer una bandera desafortunadamente 🙂

    – Naishta

    11 de mayo de 2017 a las 4:54

avatar de usuario
Adán B.

Solo para agregar algunos detalles para futuros novatos como yo.

Me encontré con este problema con libVivoxNative.a cuando compilé desde Unity a iOS. Tuve que deshabilitar el código de bits en 4 lugares diferentes:

captura de pantalla

Originalmente, supongo que lo había configurado para el Unity-iPhone de destino, no para el proyecto o las pruebas/UnityFramework. Cambiar la configuración para los 4 funcionó.

  • genial, ya no es tan sencillo como establecer una bandera desafortunadamente 🙂

    – Naishta

    11 de mayo de 2017 a las 4:54

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad