Библиотека iOS для BitCode
Недавно я загрузил Xcode 7 beta, а Xcode жалуется на то, что некоторые из моих библиотек C не компилируются в BitCode. Как я расскажу, как Clang выпускает BitCode, совместимый с iOS? Я видел похожие ответы на stackoverflow, но я не знаю, применимы ли они к созданию библиотек BitCode для iOS.
Edit:
Я использую правильный параметр -fembed-bitcode, но когда я пытаюсь архивировать, я получаю ошибку:
ld: warning: игнорирование файла XXXX/XXXX, файл был создан для архива, который не связан с архитектурой (arm64).
Когда я использую -fembed-bitcode-marker, я могу архивировать, но получаю ошибку:
полный пакет биткодов не может быть сгенерирован, потому что XX/XX был создан только с маркером биткода. Библиотека должна быть сгенерирована из сборки архива Xcode с включенным битовым кодом.
Любые идеи о том, что происходит не так? Библиотека успешно компилируется, но она не позволяет мне архивировать. Я создал простую функцию добавления и превратил ее в библиотеку, и я получаю те же симптомы, поэтому я не компилирую библиотеку.
Изменить 2:
Вы должны создать как arm64, так и armv7 версии, используя биткод и липо их вместе. Использование битового кода не избавляет от необходимости использовать жировую библиотеку при архивировании. источник: https://forums.developer.apple.com/message/25132#25132
Ответы
Ответ 1
При создании статических библиотек для генерации битового кода необходимо следующее:
-fembed-bitcode
Примечание. Эта команда доступна только с помощью Xcode7 +
В отношении принятого ответа на использование -fembed-bitcode-marker
Вы должны знать, что нормальная сборка с -fembed-bitcode-marker будет создавать минимальные размеры встроенных разделов биткода без какого-либо реального контента. Это делается как способ тестирование связанных с биткодом аспектов вашей сборки без замедления процесс сборки. Фактическое содержимое биткода включено, когда вы делаете сборка архива.
bwilson Apple Staff.
https://forums.developer.apple.com/thread/3971#12225
Более конкретно:
-
-fembed-bitcode-marker
просто отмечает, где бит-код будет в двоичном файле после сборки архива.
-
-fembed-bitcode
на самом деле делает полное генерирование и встраивание биткодов, так что это то, что вам нужно использовать для создания статических библиотек.
- Сам Xcode строит с
-fembed-bitcode-marker
для регулярных построений (например, развертывание для симулятора)
- Xcode только строит с
-fembed-bitcode
для архивных сборок/производственных сборок (поскольку это требуется только Apple).
Ответ 2
Перейдите в Настройки сборки. Найдите "пользовательские флаги компилятора".
Добавьте -fembed-bitcode
в другие флаги C.
Это обеспечит создание библиотеки lib с совместимостью в режиме компиляции во время компиляции. Я сделал это для iOS, 64-битного и 32-битного, и сделал их липовыми.
Работает как шарм.
Поскольку у вас были запросы, вот скриншот настроек: Настройки одинаковы для целевой цели проекта и целевой SDK.
![введите описание изображения здесь]()
Биткод lib не будет работать с Xcode 6.
Ответ 3
Если вы по-прежнему испытываете проблемы после добавления флага -fembed-bitcode
в другие флаги C, выполните поиск "Включить биткод" в разделе "Параметры сборки" и установите его на Нет. Это позволит вам правильно архивировать.
Ответ 4
Что вам нужно - это -fembed-bitcode. Когда ENABLE_BITCODE включен, Xcode строит с -fembed-bitcode-маркер для регулярных сборок и с -fembed-bitcode для архивных сборок. Один из вариантов просто "маркирует", где биткод будет в двоичном файле после сборки архива и вводит в действие новые правила для битовых кодов, в то время как другой на самом деле выполняет генерацию полного битового кода, что, вероятно, медленнее и, следовательно, не включено для всех типов сборки.
Руководство Syo Ikeda по обработке BITCODE также может помочь вам:
![]()
Здесь вы можете найти полную слайд-колоду.
Ответ 5
Если вы создаете статическую библиотеку и хотите включить биткод, просто
(1) ENABLE_BITCODE = ДА может быть недостаточно.
(2) Также с настройкой -fembed-bitcode
приведенная ниже ошибка все еще бросалась для нескольких файлов при построении в Teamcity
bitcode bundle could not be generated because ‘/path/fileInYourStaticLib.a(fileInYourStaticLib.o)’ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64
Несколько советов/вещей, которые следует учитывать, помогли мне в конечном итоге решить проблему в дополнение к вышеуказанным шагам (1) и (2)
-
Убедитесь, что вы установили переменную 'Other C Flags' в "-fembed-bitcode" в "PROJECT" и все "TARGETS".
-
Если есть несколько проектов, для которых вы пытаетесь создать статическую библиотеку, убедитесь, что все проекты имеют "-fembed-bitcode"
.
-
On Build Settings, click on the + sign at the top to add a user-defined build setting with the name
BITCODE_GENERATION_MODE , and set Debug to
Маркер , Release to
битового кода
-
Если вышеуказанные шаги не работают, вы также можете попробовать эту опцию. On Build Settings -> Other C flags, set Debug to
-fembed-битовый код габаритного , and Release to
-fembed-битовый код
Этот блог очень помог
https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9
Также каждый раз, когда вы делаете вышеуказанные изменения, попробуйте удалить DerivedData, очистить проект XCode и, возможно, выйти и перезапустить XCode