Библиотека 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)

  1. Убедитесь, что вы установили переменную 'Other C Flags' в "-fembed-bitcode" в "PROJECT" и все "TARGETS".

  2. Если есть несколько проектов, для которых вы пытаетесь создать статическую библиотеку, убедитесь, что все проекты имеют "-fembed-bitcode".

  3. 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 битового кода

  4. Если вышеуказанные шаги не работают, вы также можете попробовать эту опцию. 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