Какая разница между `-fembed-bitcode` и BITCODE_GENERATION_MODE?

Я обновляю статическую библиотеку для поддержки битового кода, и из моих исследований я нашел два способа добиться этого:

  • Добавление флага fembed-bitcode в параметр "Другие флаги C" в моем проекте "Настройки сборки" (ссылка)
  • Добавление пользовательской настройки с ключом BITCODE_GENERATION_MODE, установленным на bitcode (ссылка)

Есть ли разница между этими двумя параметрами?

Единственное различие, которое я заметил, заключается в том, что при использовании fembed-bitcode результирующая статическая библиотека для iphonesimulator будет построена с включенным полным битовым кодом (в моем случае размер двоичного размера изменяется от 5 МБ до 13 МБ, и я могу проверить поддержку биткода, используя otool), что, по-видимому, не влияет на его использование.

Ответ 1

Когда вы обычно создаете библиотеку, ENABLE_BITCODE=YES, Xcode добавляет флаг сборки -fembed-bitcode-marker к любому вызову clang, помещая "пустой" биткод в последний файл o.

Итак, если вы посмотрите на компиляцию в фазе сборки, она будет выглядеть примерно так:

CompileC {build_path}/StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler     cd {path}/StaticBitcode     экспорт LANG = ru_US.US-ASCII     экспорт PATH = "/Applications/Xcode.app/Содержание/Разработчик/Платформы/iPhoneOS.platform/Разработчик/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/USR/бен:/бен:/USR/SBIN:/SBIN"     /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-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 [...]

Это относится к действию сборки (независимо от цели).

Когда вы Build & Archive, флаг -fembed заменяется на -fembed-bitcode, который действительно создает двоичный код с поддержкой битового кода:

CompileC {build_path}/StaticBitcode/StaticLogger.o StaticBitcode/StaticLogger.m normal armv7 objective-c com.apple.compilers.llvm.clang.1_0.compiler     cd {path}/StaticBitcode     экспорт LANG = ru_US.US-ASCII     экспорт PATH = "/Applications/Xcode.app/Содержание/Разработчик/Платформы/iPhoneOS.platform/Разработчик/usr/bin:/Applications/Xcode.app/Contents/Developer/usr/bin:/usr/local/bin:/USR/бен:/бен:/USR/SBIN:/SBIN"     /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/clang -x objective-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 [...]


флаг fembed-bitcode

Учитывая, что

Если вы добавите флаг -fembed-bitcode к флагам Other C, вы будете отправлять два флага в компилятор во время компиляции. Возможно, вы отключите некоторые предупреждения, которые вы можете получить при использовании библиотеки, связанной с другим проектом. Но вам нужно проверить, есть ли у вас ожидаемое поведение.:)

(Когда я тестировал с помощью -fembed-bitcode на других флагах C, Xcode выдавал предупреждение clang: warning: argument unused during compilation: '-fembed-bitcode-marker')


BITCODE_GENERATION_MODE

С другой стороны,

Если вы установите BITCODE_GENERATION_MODE=bitcode на User-defined Setting, даже во время фазы сборки файлы будут скомпилированы с использованием флага -fembed-bitcode.

И, если вы установите BITCODE_GENERATION_MODE=marker, файлы будут скомпилированы с использованием флага -fembed-bitcode-marker, независимо от фазы действия.

Итак, если вы хотите включить бит-код для каждого действия (сборка и архивирование), лучший способ сделать это - использовать параметр BITCODE_GENERATION_MODE.


Ресурсы