ios xcode xcode7 bitcode

ios - ¿Cómo xcodebuild una biblioteca estática con Bitcode habilitado?



xcode7 (4)

Xcode 7 presenta Bitcode , que es una especie de binario intermedio LLVM que significa que los servidores de Apple pueden recompilar mi aplicación para diferentes arquitecturas sin mi participación.

En Lookback, distribuyo un marco de archivo estático con nuestra biblioteca. Parece que cuando compila con cualquier cosa que no sea "Build & Archive", el código de bits no se emite realmente en mi biblioteca, y cualquiera que se vincule con mi biblioteca en su aplicación e intente hacer un Build & Archive con Bitcode habilitado obtendrá uno de dos advertencias:

  • ld: ''Lookback(Lookback.o)'' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (si lib está construido con Xcode 6)
  • ld: warning: full bitcode bundle could not be generated because ''Lookback(Lookback.o)'' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) ld: warning: full bitcode bundle could not be generated because ''Lookback(Lookback.o)'' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (si lib se construye con Xcode 7 con un xcodebuild normal)

Tengo un script de compilación que construye un dispositivo + simulador binario universal, por lo que no puedo usar Build & Archive, sino que ejecuto xcodebuild desde la línea de comandos desde mi script. ¿Cómo puedo hacer que xcodebuild genere una biblioteca adecuada con código de bits habilitado?


Bitcode es una función de tiempo de compilación (no una función de tiempo de enlace), lo que significa que cada archivo .o debe contener una sección adicional llamada __bitcode cuando se construye con bitcode. Puede confirmar si su binario es compatible con otool -l (my .o or .a file) | grep __LLVM ejecutando otool -l (my .o or .a file) | grep __LLVM otool -l (my .o or .a file) | grep __LLVM .

Cuando -fembed-bitcode-marker normalmente, Xcode agrega el indicador de compilación -fembed-bitcode-marker a cualquier invocación de -fembed-bitcode-marker . Esto parece ser una especie de ''aquí es donde iría el código de bits, si el código de bits estuviera habilitado'', y en realidad no habilita el código de bits.

Cuando "Construye y -fembed-bitcode ", este indicador se reemplaza por -fembed-bitcode , que realmente construye un binario habilitado para Bitcode.

Parece que hay dos formas de hacer que xcodebuild use -fembed-bitcode :

  • Use la acción ''archive'', como en xcodebuild -target LookbackSDK archive lugar de xcodebuild -target LookbackSDK build . Esto tiene el efecto secundario de poner binarios en su Xcode Organizer en lugar de la build/ carpeta, aunque puede -exportArchive -archivePath ./build utilizando -exportArchive -archivePath ./build (gracias @JensAyton )
  • Forzar el uso de la bandera agregando otras banderas C con OTHER_CFLAGS="-fembed-bitcode" . Su invocación de xcodebuild se parecería a xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build .

Lo último es lo que elegí para no tener que cambiar mi sistema de compilación, pero generará advertencias para cada archivo, ya que ahora -fembed-bitcode-marker y -fembed-bitcode se envían a clang. ¡Afortunadamente el último gana, generando una biblioteca habilitada para Bitcode!

Recursos


Con Xcode 8, no pude hacer que OTHER_CFLAGS="-fembed-bitcode" funcione. Seguí was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build con algo que was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build cuando intenté crear una compilación Archive de una aplicación que contiene mi framework estático.

Lo que realmente estaba buscando era esto:

BITCODE_GENERATION_MODE=bitcode

De hecho, estoy usando un script de ejecución dentro de un objetivo agregado, la línea xcodebuild completa se ve así (solo como referencia):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


Una vez que agregue soporte de código de bits para la lib estática, no será compatible con Xcode 6. La aplicación no se archivará.

Me gustaría mencionar claramente la configuración del código de bits ya que la respuesta de @nevyn me confundió un poco.

Vaya a Configuración de compilación, busque "banderas compiladoras personalizadas". Agregue -fembed-bitcode . Esto construirá su lib con bitcode.


seleccione el proyecto en Configuración de compilación -> Otros indicadores C, establezca Debug en -fembed-bitcode-marker y Release en -fembed-bitcode

En Configuración de compilación, haga clic en el signo + en la parte superior para agregar una configuración de compilación definida por el usuario con el nombre BITCODE_GENERATION_MODE, y configure Debug en marcador, Release en bitcode

Edite el esquema como Release Luego lama el archivo library.a y obtenga la ruta de compilación obtenga el formulario de la biblioteca Release folder