15

Я знаю, что этот вопрос задавался несколько раз, но моя цель несколько отличается от того, что я нашел в Интернете. В частности, я уже могу создать статическую библиотеку для iPhone, но окончательный жирный файл, который я могу построить, содержит только арки и i386-архитектуры (и я не уверен, что означает рука: v6 или v7?). Я не могу скомпилировать специально для armv6 и armv7, и они объединяют обе архитектуры с использованием lipo. Липо-инструмент жалуется, что одна и та же архитектура (рука, а не armv6 или armv7) присутствует в обеих библиотеках armv6 и armv7.Как скомпилировать статическую библиотеку (fat) для armv6, armv7 и i386

Может кто-нибудь объяснить, как построить для armv6 и armv7, и объединить эти библиотеки в жир-файл с помощью lipo?

EDIT: Мне нужно построить не используя Xcode, а скомпилировать непосредственно традиционную библиотеку unix.

ответ

7

Просто используйте Libtool, чтобы связать два ARM6 и ARM7 версии вместе - его, что XCode делает. Однако у вас возникнут проблемы, если вы попытаетесь объединить эти статические библиотеки в новую супербиблиотеку. Если вам нужно это сделать, прочитайте this.

Если вы делаете это уже, то именно поэтому липо жалуется, что ваша библиотека «armv6» содержит как armv6, так и armv7. У моего сообщения есть исправление, которое, вероятно, будет проще для вас, поскольку вы не используете XCode, но в основном вы используете lipo -extract, чтобы убедиться, что у вас есть тонкая библиотека armv6 и тонкая библиотека armv7, прежде чем идти дальше.

2

Удостоверьтесь, что ваши настройки сборки установлены на Valid Architectures: armv6 armv7 и Architectures: Optimized (armv6 armv7). Это должно привести к созданию двоичного файла, оптимизированного как для v6 & v7. Если вы не уверены, что это сработало, просто установите Architectures: Standard (armv6) и сравните размеры файлов. Оптимизированный должен производить двойной размер (когда я правильно помню).

Вы также можете использовать lipo -info в своем двоичном формате, чтобы увидеть все включенные архитеки.

Запуск его на распределительную сборки мое приложение дает мне:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

Извините, я забыл упомянуть, что мне нужно построить это, не используя Xcode, но компилируя непосредственно традиционную библиотеку unix. Я редактирую свой ответ, чтобы отразить этот факт. –

2

Кажется, что нет необходимости извлекать из жировой библиотеки, прежде чем воссоединиться (как описано в ответе Джейми). Я использую окончательный 4.0 SDK из яблока, который, по-видимому, создает полные библиотеки armv6/armv7 по умолчанию.

я ранее указав архитектуру для ввода Lib так:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Это не будет работать на более поздних SDKs, но удаление архитектуры из (теперь жира) вооружить Lib работает отлично:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Теперь Lipo может обнаруживать архитектуры в жировых библиотеках.

10

Вот хорошее решение, которое я нашел: Static Libs With Support to iOS 5 and Arm64

Отредактировано:

Решение состоит в том, чтобы создать различные архитектуры разделенных затем связать их с помощью липо, с помощью командной строки (или Rakefile).

Сначала создайте двоичный файл с рукой, используя xcodebuild:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

Заметьте, что вы должны установить IPHONEOS_DEPLOYMENT_TARGET = «5,0» и арки = «ARMv7 armv7s», рекомендуется установить сборки и продукт каталоги, чтобы сделать вещи более ясны, ознакомьтесь с инструкцией по настройке сборки для более подробной информации о том, что означают эти флаги.

Следующая сборка для arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

Обратите внимание на разницу в сводах и IPHONEOS_DEPLOYMENT_TARGET. Нам также необходимо построить для симулятора, в этом случае мы должны изменить, чтобы iphonesimulator7.0 SDK и построить в два этапа первого для i386:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

Теперь сложная часть! Если вы просто измените ARCHS на x86_86 в зависимости от вашего параметра Xcode, вы получите сообщение об ошибке: «x86_64 не является допустимой дугой». Чтобы избежать этого просто добавьте VALID_ARCHS = «x86_64»:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

Наконец, мы просто должны создать жир двоичный файл со всеми 5 архитектур:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

Автор создал рабочий пример этого, вы можно получить: https://github.com/diogot/StaticLibDemo


Вот ссылка на этот пост: Static Libs With Support to iOS 5 and Arm64

Все кредиты переданы Diogo Tridapalli.

+0

Спасибо, что сказал мне! @kleopatra – Yang

+0

Спасибо за кредиты @yang! –

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