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 dexcodebuild -target LookbackSDK build
. Esto tiene el efecto secundario de poner binarios en su Xcode Organizer en lugar de labuild/
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 dexcodebuild
se parecería axcodebuild 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