Как создать статическую библиотеку 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 ответа:
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
редактировать схему как релиз Тогда оближи библиотеку.файл и получить путь сборки получить папку выпуска формы библиотеки