objective-c static-libraries bitcode

objective c - ¿Cuál es la diferencia entre `-fembed-bitcode` y BITCODE_GENERATION_MODE?



objective-c static-libraries (1)

He estado actualizando una biblioteca estática para admitir código de bits, y de mi investigación encontré dos maneras de lograrlo:

  • Agregar el fembed-bitcode a la opción Otros indicadores de C en mi proyecto Crear configuración ( link )
  • Agregar una configuración definida por el usuario con la clave BITCODE_GENERATION_MODE establecida en bitcode ( link )

¿Hay alguna diferencia entre estas dos opciones?

La única diferencia que noté es que al usar fembed-bitcode , la biblioteca estática resultante para iphonesimulator se construirá con el código de bits completo habilitado (en mi caso, el tamaño binario cambia de 5MB a 13MB, y puedo verificar el soporte de otool usando otool ), que No parece hacer ninguna diferencia en su uso.


Cuando construyes la biblioteca normalmente, con ENABLE_BITCODE=YES , Xcode agrega el -fembed-bitcode-marker compilación -fembed-bitcode-marker a cualquier invocación de clang, colocando un bitcode "vacío" en el archivo o final.

Por lo tanto, si observa la acción de compilación en la fase de compilación, se verá algo así como:

CompileC {build_path} /StaticBitcode/StaticLogger.o StaticBitcode / StaticLogger.m normal armv7 object-c com.apple.compilers.llvm.clang.1_0.compiler cd {path} / StaticBitcode export LANG = es_ES.US-ASCII export PATH = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin : / bin: / usr / sbin: / sbin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x object-c -arch armv7 -fmessage-length = 0 -fdiagnostics -show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- -fembed-bitcode-marker [...]

Esto es cierto para la acción de compilación (independiente del objetivo).

Cuando -fembed-bitcode , el indicador -fembed se reemplaza por -fembed-bitcode , que realmente construye un binario habilitado para Bitcode:

CompileC {build_path} /StaticBitcode/StaticLogger.o StaticBitcode / StaticLogger.m normal armv7 object-c com.apple.compilers.llvm.clang.1_0.compiler cd {path} / StaticBitcode export LANG = es_ES.US-ASCII export PATH = "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/usr/bin : / bin: / usr / sbin: / sbin "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x object-c -arch armv7 -fmessage-length = 0 -fdiagnostics -show-note-include-stack -fmacro-backtrace-limit = 0 -std = gnu99 -fobjc-arc -fmodules -gmodules -fmodules-cache- [...] -fembed-bitcode [...]


bandera de código de bits

Dado que, si agrega la -fembed-bitcode a las banderas Other C, enviará dos banderas al compilador durante el tiempo de compilación. Puede silenciar algunas advertencias que puede recibir al usar la biblioteca vinculada en otro proyecto. Pero, necesita comprobar si obtiene el comportamiento esperado. :)

(Cuando probé el uso del -fembed-bitcode con -fembed-bitcode en los indicadores de Otra C, Xcode dio el clang: warning: argument unused during compilation: ''-fembed-bitcode-marker'' )


BITCODE_GENERATION_MODE

Por otra parte,

Si configura BITCODE_GENERATION_MODE=bitcode en su User-defined Setting por el User-defined Setting , incluso durante la fase de compilación, los archivos se compilarán utilizando el -fembed-bitcode .

Y, si configura BITCODE_GENERATION_MODE=marker , los archivos se compilarán usando el -fembed-bitcode-marker bandera, independientemente de la fase de acción.

Por lo tanto, si desea habilitar el código de bits para cada acción (compilación y archivo), la mejor manera de hacerlo es usar la configuración BITCODE_GENERATION_MODE .


Recursos