Слияние 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
каталог.