2016-11-30 5 views
1

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

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

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

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

MyFramework.framework/MyFramework 

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

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

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

Однако, поскольку биткод включен, App Store будет обрабатывать .ipa и перекомпилировать с помощью битового кода, в этом случае он терпит неудачу, и я получаю электронное письмо от App Store, которое не удалось обработать. Следуя инструкциям, я могу воспроизвести ошибку локально с помощью Exporting for Ad-Hoc Distribution и перекомпиляции для битового кода. Ошибка я получаю это:

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

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

>> 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 каталогом.

Смежные вопросы