Я знаю, что этот вопрос несколько раз ставился, но моя цель немного отличается относительно того, что я нашел поиском сети. А именно, я уже могу создать статическую библиотеку для iPhone, но заключительный толстый файл, который я могу создать только, содержит руку и i386 архитектуру (и я не уверен тому, что отсылает рука: v6 или v7?). Я не могу скомпилировать специально для armv6, и armv7 и они объединяют обе архитектуры с помощью lipo. lipo инструмент жалуется, что та же архитектура (рука, не armv6 или armv7) присутствует и в armv6 и в armv7 библиотеках.
Кто-то может объяснить точно, как создать для armv6, и armv7 и они объединяют эти библиотеки в толстый файл с помощью lipo?
Править: Я должен создать не использование XCode, но компиляцию непосредственно традиционная библиотека Unix.
Просто используйте libtool, чтобы связать две версии arm6 и arm7 вместе - это то, что делает XCode. Однако у вас возникнут проблемы, если вы попытаетесь объединить эти статические библиотеки в новую супербиблиотеку. Если вам нужно это сделать, прочтите это .
Если вы это уже делаете, то, возможно, липо жалуется, что ваша библиотека "armv6" содержит и armv6, и armv7. В моем сообщении есть исправление, которое, вероятно, будет проще для вас, поскольку вы не используете XCode, но в основном вы используете липо-экстракт, чтобы убедиться, что у вас есть тонкая библиотека armv6 и тонкая библиотека armv7, прежде чем идти дальше.
Убедитесь, что в настройках сборки установлено значение Допустимые архитектуры: armv6 armv7
и Архитектуры: оптимизированы (armv6 armv7)
. В результате должен получиться бинарный файл, оптимизированный как для v6, так и для v7. Если вы не уверены, что это сработало, просто установите Архитектуры: Стандарт (armv6)
и сравните размеры файлов. Оптимизированный должен выдавать вдвое больший размер (если я правильно помню).
Вы также всегда можете использовать lipo -info
в своем двоичном файле, чтобы увидеть все включенные архитектуры.
Запуск его в сборке дистрибутива моего приложения дает мне:
ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My
Architectures in the fat file: My are: armv6 armv7
Кажется, нет необходимости извлекать из библиотеки жира перед повторным присоединением (как описано в ответе Джейми). Я использую последнюю версию 4.0 SDK от Apple, которая по умолчанию создает толстые библиотеки armv6 / armv7.
Я ранее указывал архитектуру для входной библиотеки следующим образом:
$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
Это не удается в более поздних SDK, но удаление архитектуры из (теперь уже толстой) библиотеки arm работает нормально:
$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 теперь должен иметь возможность обнаруживать архитектуры в жирных библиотеках.