Як xcode побудувати статичну бібліотеку з увімкненим Bitcode?


89

Xcode 7 представляє Bitcode , який є деяким проміжним двійковим файлом LLVM, що означає, що сервери Apple можуть перекомпілювати мою програму для різних архітектур без моєї участі.

У Lookback я поширюю фреймворк статичного архіву з нашою бібліотекою. Здається, що коли ви будуєте будь-що, крім "Побудувати та архівувати", біт-код насправді не передається в мою бібліотеку, і кожен, хто зв'язується з моєю бібліотекою у своєму додатку та намагається виконати побудову та архівування з увімкненим біт-кодом, отримає один із два попередження:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (якщо lib побудований за допомогою Xcode 6)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (якщо lib будується за допомогою Xcode 7 із звичайним xcodebuild)

У мене є сценарій збірки, який створює універсальний двійковий файл пристрою + симулятор, тому я не можу використовувати Build & Archive, а навпаки, я запускаю xcodebuildз командного рядка зі свого сценарію. Як я можу змусити xcodebuildгенерувати належну бібліотеку з підтримкою біт-коду?


HI @nevyn Я намагаюся змусити ваш SDK скомпілювати в програмі, яка використовує біт-код. Чи є спосіб?
Stoff81

@ Stoff81 Вибачте, я працюю над цим. Мені потрібно спочатку змусити всі мої залежності працювати з Bitcode, і це досить багато роботи.
nevyn

Відповіді:


137

Біткод - це функція часу компіляції (не функція часу зв’язку), що означає, що кожен файл .o повинен містити додатковий розділ під назвою __bitcode, коли він будується за допомогою біт-коду. Ви можете підтвердити, чи є ваш двійковий файл сумісним з біт-кодами, запустивши otool -l (my .o or .a file) | grep __LLVM.

Коли ви будуєте нормально, Xcode додає прапор побудови -fembed-bitcode-markerдо будь-якого виклику дзвінків. Здається, це щось на кшталт речі "сюди би йшов біт-код, якщо біт-код був увімкнений", і насправді не вмикає біт-код.

Коли ви -fembed-bitcodeстворюєте та архівуєте , цей прапор замінюється на , що насправді створює двійковий файл із підтримкою біткоду.

Здається, існує два способи xcodebuildвикористання -fembed-bitcode:

  • Використовуйте дію "архівування", як xcodebuild -target LookbackSDK archiveзамість xcodebuild -target LookbackSDK build. Це має побічний ефект від розміщення двійкових файлів у вашому Xcode Organizer замість build/папки, хоча ви можете обійти це, використовуючи -exportArchive -archivePath ./build(спасибі @JensAyton )
  • Примусово використовувати прапор, додавши інші прапори C за допомогою OTHER_CFLAGS="-fembed-bitcode". Ваше xcodebuildзвернення могло б виглядати приблизно так xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Останнє , що я вибрав , так що я не повинен змінити систему збирання, але він буде генерувати попередження для кожного файлу, так як тепер , як -fembed-bitcode-markerі -fembed-bitcodeвідправляються дзвін. На щастя, останній перемагає, створюючи бібліотеку з підтримкою біт-коду!

Ресурси


9
FWIW, ви можете позбутися попередження про -fembed-bitcode-markerігнорування, додавши -Qunused-argumentsтакож.
mstorsjo

який exportFormat використовувати для xcodebuild фреймворку? Здається, визначено лише "ipa", "pkg" та "app" ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Фабіан Кобел

@nevyn все ще не міг побудувати мій основний додаток, який має власний файл фреймворку, який, у свою чергу, містить сценарій збірки із зазначеним вище прапором.
ravoorinandan

otool -l (мій файл .o або .a). Ви маєте на увазі otool -l (мій файл .o або .a) | grep __bitcode?
Mike M

1
@MikeM насправді немає otool -l myfile.o | grep __LLVM, тому що буде сегмент __bitcode, навіть якщо там буде лише маркер біт-коду замість справжнього біт-коду.
nevyn

41

З Xcode 8 я не міг приступити OTHER_CFLAGS="-fembed-bitcode"до роботи. Я постійно стикався з чимось подібним, was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildколи намагався створити збірку архіву програми, що містить мою статичну структуру.

Що я насправді шукав це:

BITCODE_GENERATION_MODE=bitcode

Я фактично використовую сценарій запуску всередині сукупної цілі, повний рядок xcodebuild виглядає так (лише для довідки):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build


2
+1, BITCODE_GENERATION_MODE=bitcodeметод, як видається, є кращим, як пропонується і в цій відповіді .
Вільям Денніс,

Це також виправило мою проблему, тоді як відповідь за замовчуванням більше не.
Камчатка

Рятувальник життя! Дякую!
vidalbenjoe

17

Як тільки ви додасте підтримку біт-коду для статичної бібліотеки, вона не буде сумісна з Xcode 6. Додаток не буде архівувати.

Я хотів би чітко згадати налаштування для біт-коду, оскільки відповідь @ nevyn мене трохи збентежила.

Перейдіть до налаштувань побудови, знайдіть "власні прапори компілятора". Додати -fembed-bitcode. Це створить вашу бібліотеку за допомогою біт-коду.


6

Виберіть проект Налаштування збірки -> Інші прапори C, встановіть Debug на -fembed-bitcode-marker та Release на -fembed-bitcode

У Налаштуваннях збірки натисніть на знак + у верхній частині, щоб додати визначений користувачем параметр збірки з ім'ям BITCODE_GENERATION_MODE та встановіть Налагодження маркером, Відпустити в біт-код

Редагувати схему як Release Потім клацніть потрібну бібліотеку. Файл і отримати шлях до збірки. Отримайте папку випуску бібліотечної форми.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.