Как я компилирую статическую библиотеку (жир) для armv6, armv7 и i386

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

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

Править: Я должен создать не использование XCode, но компиляцию непосредственно традиционная библиотека Unix.

16
задан Massimo Cafaro 8 May 2010 в 09:42
поделиться

3 ответа

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

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

7
ответ дан 30 November 2019 в 22:02
поделиться

Убедитесь, что в настройках сборки установлено значение Допустимые архитектуры: 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 
2
ответ дан 30 November 2019 в 22:02
поделиться

Кажется, нет необходимости извлекать из библиотеки жира перед повторным присоединением (как описано в ответе Джейми). Я использую последнюю версию 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 теперь должен иметь возможность обнаруживать архитектуры в жирных библиотеках.

2
ответ дан 30 November 2019 в 22:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: