Слияние iOS .dylib в фреймворк с перерывом перекомпиляции битового кода

Я пытаюсь построить динамический iOS-фреймворк вручную из .dylib файлы. Двоичные файлы создаются с помощью cmake и xcodebuild и производят два .dylib файлы, один из которых содержит armv7, armv7s а также arm64 и другие x86_64 а также i386 архитектуры. Библиотеки составлены с -fembed-bitcode parameter и все удается.

Файлы.dylib затем объединяются с помощью следующей команды:

lipo -create lib_arm.dylib lib_i386.dylib -output MyFramework

Затем создается структура путем копирования вывода команды lipo в:

MyFramework.framework/MyFramework

Заголовки и Info.plist создаются вручную и добавляются в структуру.

Эта структура затем устанавливается через CocoaPods в приложение как vendored_framework, Известно, что CocoaPods извлекает библиотеки i386/x86_64 из любых толстых двоичных файлов для распространения в App Store.

Приложение создает, запускает, архивирует и успешно загружает в App Store.

Однако, поскольку битовый код включен, App Store будет обрабатывать.ipa и перекомпилировать с битовым кодом, в этом случае происходит сбой, и я получаю электронное письмо из App Store о том, что он не прошел обработку. Следуя инструкциям, я могу воспроизвести ошибку локально с помощью функции "Экспорт для специального распространения" и перекомпиляции для битового кода. Я получаю сообщение об ошибке:

ipatool failed with an exception: #<Errno::ENOENT: No such file or directory - /lib_arm.dylib>\n

Таким образом, по-видимому, во время перекомпиляции, есть еще ссылка или где-то lib_arm.dylib хотя он был объединен в универсальный бинарный файл Mach-O file вывод объединенного двоичного файла dylib ниже):

>> file MyFramework
MyFramework: Mach-O universal binary with 5 architectures: [x86_64: Mach-O 64-bit dynamically linked shared library x86_64] [i386] [arm_v7] [arm_v7s] [arm64]
MyFramework (for architecture x86_64):  Mach-O 64-bit dynamically linked shared library x86_64
MyFramework (for architecture i386):    Mach-O dynamically linked shared library i386
MyFramework (for architecture armv7):   Mach-O dynamically linked shared library arm_v7
MyFramework (for architecture armv7s):  Mach-O dynamically linked shared library arm_v7s
MyFramework (for architecture arm64):   Mach-O 64-bit dynamically linked shared library arm64

Это в значительной степени, где мои знания компилятора / компоновщика выходит за рамки. Итак, мой вопрос:

Куда я иду с этим не так? Может быть, биткод должен быть скомпилирован по-другому? Или, может быть, я использую lipo неправильно?

Спасибо!

1 ответ

Решение

После проверки команд загрузки созданного толстого двоичного файла с otool -l Команда, я понял, что с помощью lipo само по себе не меняет LC_ID_DYLIB в двоичном файле, и он будет использовать один из первой предоставленной библиотеки. С помощью install_name_tool изменить идентификатор, чтобы исправить один из фреймворка (в том числе @rpath для iOS динамических фреймворков) исправляет ошибку.

install_name_tool -id @rpath/MyFramework.framework/MyFramework MyFramework

Убедитесь, что весь путь к бинарному файлу включен вместе с .framework каталог.

Другие вопросы по тегам