Библиотека iOS в BitCode

Я недавно загрузил бета-версию Xcode 7, и Xcode жалуется на то, что некоторые из моих библиотек C не компилируются в BitCode. Как мне сказать Clang создать BitCode, совместимый с iOS? Я видел похожие ответы на stackoverflow, но не знаю, применимы ли они к созданию библиотек BitCode для iOS.

Редактировать:

Я использую правильный параметр -fembed-bitcode, но когда я пытаюсь заархивировать, я получаю сообщение об ошибке: ld: warning: игнорируя файл XXXX / XXXX, файл был создан для архива, который не является связанной архитектурой (arm64). Когда я использую -fembed-bitcode-marker, я могу архивировать, но получаю сообщение об ошибке: не удалось сгенерировать полный пакет битового кода, потому что XX / XX был построен только с маркером битового кода. Библиотека должна быть сгенерирована из сборки архива Xcode с включенным битовым кодом.

Есть идеи о том, что происходит не так? Библиотека успешно компилируется, но не позволяет архивировать. Я создал простую функцию добавления и превратил ее в библиотеку, и у меня те же симптомы, так что это не та библиотека, которую я компилирую.

Изменить 2: вы должны собрать обе версии arm64 и armv7, используя бит-код и липо их вместе. Использование битового кода не устраняет необходимости в большой библиотеке при архивировании. источник: Ссылка


person stack_tom    schedule 05.07.2015    source источник
comment
так вы сами компилируете эти библиотеки C?   -  person user102008    schedule 06.07.2015
comment
Ага, конкретно про gmp. Но в целом я спрашиваю, как получить clang для создания BitCode, который работает с iOS. Я знаю, что есть возможность заставить clang останавливаться на промежуточном представлении (IR), но я не знаю, будет ли это работать со всем BitCode, о котором сейчас упоминает Apple.   -  person stack_tom    schedule 06.07.2015


Ответы (5)


При создании статических библиотек вы должны добавить следующее для генерации битового кода:

-fembed-bitcode 

для динамической библиотеки вам необходимо дополнительно связать с

-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).
person Danoli3    schedule 10.07.2015
comment
Спасибо за хитрость сборки xcode-select, она очень полезна, и я не знал об этом. Итак, если я использую -fembed-bitcode, будут ли созданные библиотеки работать в симуляторе? В настоящее время мне приходится использовать библиотеки -fembed-bitcode-marker при развертывании на устройстве, но при работе на симуляторе мне приходится использовать мои ранее скомпилированные жирные библиотеки, иначе я получаю ошибки компоновщика. Кроме того, если я использую -fembed-bitcode-marker, создает ли Xcode версии битового кода библиотеки при развертывании на устройстве, поскольку я больше не получаю предупреждений? - person stack_tom; 11.07.2015
comment
Хорошо, я построил с помощью этой команды. Однако у меня те же симптомы, что и раньше - толстые библиотеки работают на симуляторе, а библиотеки битового кода -fembed - нет. Кроме того, я не могу архивировать. Xcode говорит ld: warning: игнорируя файл X, файл был создан для архива, который не является связываемой архитектурой (arm64). Когда я использую библиотеку -fembed-bitcode-marker, она позволяет мне архивировать, однако я снова получаю предупреждения о битовом коде, как вы сказали (поскольку на самом деле это не битовый код). Почему я не могу архивировать с помощью -fembed-bitcode только тогда, там даже написано, что он был создан для архивирования. - person stack_tom; 11.07.2015
comment
У меня такая же проблема, и я пробовал то же самое: / - person Prateek; 10.10.2015
comment
Где я должен вставить эту строку, скажите мне, пожалуйста - person Mahesh Narla; 24.02.2017

Перейдите в Настройки сборки. Найдите "настраиваемые флаги компилятора".
Добавьте -fembed-bitcode к другим флагам C. Это гарантирует, что библиотека будет построена с совместимостью битового кода во время компиляции. Я сделал это для 64-битной и 32-битной iOS и склеил их в одно целое. Работает как шарм.

Поскольку у вас, ребята, были запросы, вот снимок экрана с настройками: настройки одинаковы для цели проекта и цели SDK.

введите описание изображения здесь


Библиотека битового кода не будет работать с Xcode 6.

person Gautam Jain    schedule 15.09.2015
comment
Не могли бы вы поделиться скриптом для создания 64-битной, 32-битной и для симулятора, а затем объединить их в один? - person Satyam; 08.10.2015
comment
lipo -create -output «destination» «source1» «source2» источник 3. Здесь источник 1 - это ваш путь к 32-битной библиотеке симулятора, источник 2 - это путь к 64-битной библиотеке симулятора, а источник 3 - это путь к библиотеке устройства iOS. . Делается это с терминала. Вы можете проверить окончательные сведения о библиотеке с помощью этой команды lipo -info путь к окончательной библиотеке - person Gautam Jain; 08.10.2015
comment
Спасибо, мне нужна команда сборки для создания 32-битных и 64-битных файлов lib - person Satyam; 08.10.2015
comment
@GautamJain, я использую XCode7.0.1, и я добавил другие флаги C с -fembed-bitcode, Enable Bitcode = YES в настройках целевой сборки, а затем запустил команду lipo на сборках устройства и симулятора. Кроме того, я использую сценарий оболочки для создания сборок устройства и симулятора с параметрами ENABLE_BITCODE = YES и OTHER_CFLAGS = -fembed-bitcode. Однако мне, кажется, не везет с жирной библиотекой. Битовый код удален из толстой библиотеки, и я не могу заархивировать свое приложение, если для параметра Enable Bitcode = YES в настройках целевой сборки приложения задано значение «Enable Bitcode = YES». Я не понимаю, почему липо убирает флаги биткода? - person Deepak Badiger; 13.10.2015
comment
бит-код удален из толстой библиотеки, я тоже это вижу. Я пытаюсь убедить себя, что это ожидаемое поведение ... - person jmoody; 23.11.2015
comment
@jmoody - У меня работает. Если я запустил эту команду otool -l /Users/gautam/Desktop/SDK/V1.8.5/MoEngage/libMoEngageSDK.a | grep LLVM. Получаю результат segname __LLVM. Если я сделаю это с библиотекой, которую я построил без битового кода, я ничего не получу. Следовательно, это означает, что в моей библиотеке есть битовый код. Прикрепив в ответ скриншот моих настроек. - person Gautam Jain; 30.11.2015
comment
должен ли он также быть на C ++ или только на C ?? - person Fattie; 23.07.2019

Если у вас все еще возникают проблемы после добавления -fembed-bitcode к другим флагам C, найдите «Включить битовый код» в разделе «Параметры сборки» и установите для него значение Нет. Это позволит вам правильно архивировать.

person Ian Han    schedule 27.04.2016
comment
Вы, сударь, спасаете жизнь! Спасибо! - person Tash Pemhiwa; 01.03.2017

Что вам нужно, так это -fembed-bitcode. Когда ENABLE_BITCODE включен, Xcode строит с -fembed-bitcode-marker для обычных сборок и с -fembed-bitcode для архивных сборок. Один вариант просто «отмечает», где будет битовый код в двоичном коде после сборки архива, и применяет новые правила битового кода, в то время как другой фактически выполняет полную генерацию битового кода, которая, вероятно, медленнее и, следовательно, не включена для всех типов сборки. .

Руководство Сё Икэды по работе с BITCODE также может вам помочь:

Здесь вы можете найти полную колоду слайдов.

person Zeeshan    schedule 02.11.2015

Если вы создаете статическую библиотеку и хотите включить битовый код, просто (1) ENABLE_BITCODE = YES может быть недостаточно.

(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 nameBITCODE_GENERATION_MODE, and set Debug tomarker, Release tobitcode

  4. Если описанные выше действия не помогли, вы также можете попробовать этот вариант. On Build Settings -> Other C flags, set Debug to-fembed-bitcode-marker, and Release to-fembed-bitcode

Этот блог очень помог https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9.

Также каждый раз, когда вы вносите указанные выше изменения, попробуйте удалить DerivedData, очистить проект XCode и, возможно, выйти и перезапустить XCode.

person Naishta    schedule 27.04.2017
comment
круто, к сожалению, это не так просто, как установить флаг :) - person Naishta; 11.05.2017