Как проверить, поддерживается ли фреймворк Bitcode для Xcode7

Начиная с Xcode 7 одной из распространенных проблем стало то, что сторонние фреймворки должны поддерживать Биткод. Мы также можем отключить BITCODE, установив для ENABLE_BITCODE значение NO в настройках сборки. Но я не хочу его отключать, вместо этого я хочу преобразовать все свои фреймворки в совместимые с BITCODE.

Итак, как проверить, совместим ли фреймворк с BITCODE, кроме компиляции фреймворка в Xcode. Иногда Xcode выдает ошибку совместимости BITCODE для одной платформы, оставляя другие, даже если они не поддерживают BITCODE.

Есть ли какой-нибудь инструмент/проверка командной строки?


person ipraba    schedule 27.09.2015    source источник


Ответы (6)


Из обсуждения этого форума разработчиков Apple пользователь dshirley и bwilson рекомендуется использовать инструменты командной строки otool и grep, чтобы проверить, существуют ли разделы битового кода.

$ otool -l libName.o | grep __LLVM

or

$ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM

Выполнив приведенную выше команду, если библиотека содержит битовый код, вы увидите вывод segname __LLVM.

person Michael M. Myers    schedule 30.09.2015
comment
Спасибо за ответ Михаил. Таким образом, этот инструмент работает с файлами .o или .a. Как проверить файл .framework? - person ipraba; 01.10.2015
comment
.framework — это просто хороший способ упаковки ресурсов, общедоступных заголовков и библиотеки вместе. Библиотека находится там, вам нужно будет запустить команду на ней. Так, например, в зависимости от структуры каталогов: $ otool -l MyFramework.framework/Versions/A/MyFramework | grep __LLVM, где MyFramework — библиотека (без расширения файла). Для получения дополнительной информации о структурах каталогов фреймворка см. developer.apple.com/library/ios/documentation/MacOSX/Conceptual/ - person Michael M. Myers; 01.10.2015
comment
Спасибо за информацию Михаил - person ipraba; 01.10.2015
comment
Используйте это, чтобы проверить все файлы .a в вашем дереве (обратите внимание, что последняя точка с запятой ДОЛЖНА быть частью команды. Также не забудьте сделать test_bitcode.sh исполняемым): find . -name '*a' -type f -exec ./test_bitcode.sh {} \; Содержимое test_bitcode.sh: echo ***** TESTING $1 ; otool -l $1 | grep __LLVM | голова -n1 - person PerfectGamesOnline.com; 20.10.2015
comment
Я не могу заставить этот метод работать и написал об этом новый пост (stackoverflow.com/questions/35014582/) Если кто-нибудь может помочь, дайте мне знать. - person Locksleyu; 26.01.2016
comment
Проблема с этим ответом заключается в том, что если вы строите с помощью -fembed-bitcode-marker, вы также увидите segname __LLVM в своем выводе, но на самом деле у вас нет битового кода - просто место в библиотеке для него. См. этот ответ - stackoverflow.com/questions/34959767/ - person Joe Steele; 11.05.2017
comment
Почему мой фреймворк не содержит каталог Versions? Разве это не обязательно для фреймворка? - person Desmond DAI; 22.09.2017
comment
Это работает только для меня при проверке конкретной архитектуры. например otool -arch arm64 -l MyFramework.framework/Versions/A/MyFramework | grep LLVM - person Adam Johns; 11.09.2018
comment
Выполнив эту команду, я получил это /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/objdump: 'teliver.o': Нет такого файла или каталога - person Vinoth Vino; 23.04.2019

Принятый ответ предполагает, что вы должны сделать grep __LLVM, но я бы предпочел сделать это

otool -l libName.o | grep __bitcode

поскольку существуют разные сегменты __LLVM, и не все из них указывают на наличие биткода. Вот пример:

Section
  sectname __bitcode
   segname __LLVM
      addr 0x00000000000007d0
      size 0x0000000000000f10
    offset 3360
     align 2^4 (16)
    reloff 0
    nreloc 0
     flags 0x00000000
 reserved1 0
 reserved2 0
Section
  sectname __cmdline
   segname __LLVM
      addr 0x00000000000016e0
      size 0x0000000000000069
    offset 7216
     align 2^4 (16)
    reloff 0
    nreloc 0
     flags 0x00000000
 reserved1 0
 reserved2 0

Наличие раздела __cmdline не означает, что биткод присутствует, но он также будет найден при простом поиске __LLVM.

person Mecki    schedule 09.11.2015
comment
Это не работает. У меня есть среда Swift, и поиск __LLVM с включенным битовым кодом работает, но это не так. - person David S.; 17.02.2016
comment
На forums.developer.apple.com/message/7038 пользователь bwilson (сотрудники Apple) упоминает, что поиск __bitcode ненадежен, и рекомендует __LLVM - person Michael M. Myers; 12.07.2016

Я заметил, что раздел __bitcode присутствует только для статических библиотек, а не для динамических библиотек. Итак, одним из решений является приведенная ниже команда.

otool -l libDeviceManager.a | grep __LLVM 

Кроме того, иногда с толстыми двоичными файлами otool может не давать сегменты __LLVM, даже если они присутствуют. Вы можете использовать следующую команду для этих случаев

otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM
person SnehaK    schedule 19.08.2018
comment
На сегодняшний день этот метод работает для меня. Это не работает, когда я не указываю никакой архитектуры - person superjos; 30.05.2019
comment
@superjos да, вам нужно указать архитектуру для толстых двоичных файлов. - person SnehaK; 31.05.2019

вы можете попробовать эти команды:

otool -arch armv7 -l libDeviceManager.a | grep bit code

и

otool -arch arm64 -l libDeviceManager.a | grep bitcode
person naresh d    schedule 21.12.2016

Установите флаг в Targets:

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

Биткод включен

otool -arch arm64 -l myFramework | grep __LLVM
  segname __LLVM
   segname __LLVM

Я (ошибочно) ожидал прочитать тот же вывод для локальной сборки приложения iOS. Это было не так. Эта же команда ничего не выдала, несмотря на наличие ENABLE_BITCODE YES. Только когда вы выбрали Archive, начался процесс bitcode.

Этот ответ помог мне:

В чем разница между `-fembed-bitcode` и BITCODE_GENERATION_MODE ?

person rustyMagnet    schedule 14.02.2020

Еще один подход

otool -v -s __LLVM __bundle <binary_path>
//e.g.
otool -v -s __LLVM __bundle "/Users/alex/MyModule.framework/MyModule" 

или найти __bundle раздел в __LLVM сегменте

otool -l <binary_path> | grep __bundle 

[Биткод]

person yoAlex5    schedule 04.04.2021