Как проверить, поддерживает ли среда BITCODE для Xcode7

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

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

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

Ответы

Ответ 1

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

$ otool -l libName.o | grep __LLVM

или

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

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

Ответ 2

Принятый ответ предполагает, что вы должны сделать 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.

Ответ 3

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

otool -l libDeviceManager.a | grep __LLVM 

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

otool -arch armv7 -l libDeviceManager.framework/libDeviceManager | grep __LLVM

Ответ 4

вы можете попробовать следующие команды:

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

и

otool -arch arm64 -l libDeviceManager.a | grep bitcode