Как создать статическую библиотеку xcodebuild с включенным Битовым кодом?


Xcode версии 7 включает в себя Bitcode, что является своего рода промежуточным двоичным файлом LLVM, что означает, что серверы Apple могут перекомпилировать мое приложение для разных архитектур без моего участия.

в Lookback я распространяю статическую структуру архива с нашей библиотекой. Кажется, что когда вы строите с чем-либо, кроме "Build & Archive", bitcode фактически не излучается в мою библиотеку, и любой, кто связывается с моей библиотекой в своем приложении и пытается сделать Build & Archive с помощью Bitcode enabled получит одно из двух предупреждений:

  • 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. (Если lib построен с 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) (если lib построен с Xcode 7 с обычным xcodebuild)

у меня есть скрипт сборки, который строит устройство + симулятор универсальный двоичный файл, поэтому я не могу использовать Build & Archive, а скорее, я запускаю xcodebuild из командной строки из моего скрипта. Как я могу сделать xcodebuild создать правильную библиотеку с поддержкой битового кода?

4 70

4 ответа:

Bitcode-это функция времени компиляции (а не функция времени ссылки), что означает, что каждый .o файл должен содержать дополнительный раздел с именем _ _ bitcode при построении с помощью bitcode. Вы можете подтвердить, совместим ли ваш двоичный файл с битовым кодом, запустив otool -l (my .o or .a file) | grep __LLVM.

когда вы строите нормально, Xcode добавляет флаг сборки -fembed-bitcode-marker для любого вызова clang. Это, кажется, какой-то "это где bitcode будет идти, если bitcode был включен" вещь, и на самом деле не позволяет битовый код.

когда вы "строите и Архивируете", этот флаг заменяется на -fembed-bitcode, который действительно создает двоичный файл с поддержкой Bitcode.

кажется, есть два способа сделать xcodebuild использовать -fembed-bitcode:

  • используйте действие "архив", как в xcodebuild -target LookbackSDK archive вместо xcodebuild -target LookbackSDK build. Это имеет побочный эффект размещения двоичных файлов в вашем организаторе Xcode вместо , хотя вы можете обойти это с помощью -exportArchive -archivePath ./build (спасибо @JensAyton)
  • принудительное использование флага путем добавления других флагов C с OTHER_CFLAGS="-fembed-bitcode". Ваш xcodebuild вызов будет выглядеть примерно так xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

последнее-это то, что я выбрал, чтобы мне не пришлось менять свою систему сборки, но она будет генерировать предупреждения для каждого файла, так как теперь оба -fembed-bitcode-marker и -fembed-bitcode отправляются на Clang. К счастью, последний выигрывает, генерируя бит-код с поддержкой библиотека!

ресурсы

С Xcode 8, я не мог получить OTHER_CFLAGS="-fembed-bitcode" на работу. Я все время натыкался на что-то вроде was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build когда я попытался создать архивную сборку приложения, содержащего мою статическую структуру.

то, что я искал был этот:

BITCODE_GENERATION_MODE=bitcode

Я на самом деле использую скрипт запуска внутри агрегатной цели, полная строка xcodebuild выглядит так (просто для справки):

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

Как только вы добавите поддержку bitcode для статической библиотеки, она не будет совместима с Xcode 6. Приложение не будет архивировать.

Я хотел бы четко указать настройку для bitcode, поскольку ответ @nevyn немного смутил меня.

перейдите к настройкам сборки, найдите "пользовательские флаги компилятора". Добавить -fembed-bitcode. Это позволит построить вашу библиотеку с помощью bitcode.

выберите проект На Настройки -> построить другие с флагами, значение по умолчанию -fembed-биткода-маркер и релиз -fembed-биткода

в настройках сборки нажмите на знак + вверху, чтобы добавить пользовательский параметр сборки с именем BITCODE_GENERATION_MODE и установите Debug в marker, Release to bitcode

редактировать схему как релиз Тогда оближи библиотеку.файл и получить путь сборки получить папку выпуска формы библиотеки