Похоже, что теоретически мы можем создать единую статическую библиотеку, которая включает в себя как симулятор, так и iPhone и iPad.
Однако у Apple нет документации по этому вопросу, которую я могу найти, и шаблоны Xcode по умолчанию НЕ настроены для этого.
Я ищу простой, портативный, многократно используемый метод, который можно сделать внутри Xcode.
Немного истории:
- В 2008 году мы имели возможность создавать отдельные статические библиотеки, включающие как сим, так и устройство. Apple отключила это.
- В течение 2009 года мы делали пары статических библиотек - одну для сима, другую для устройства. Apple теперь тоже отключила это.
Ссылки:
Это отличная идея, это отличный подход, но он не работает: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- В его скрипте есть некоторые ошибки, которые означают, что он работает только на его компьютере - он должен использовать BUILT_PRODUCTS_DIR и / или BUILD_DIR вместо того, чтобы «угадывать» их)
- Последний Xcode Apple не позволяет вам делать то, что он сделал - это просто не будет работать из-за (документированного) изменения в том, как Xcode обрабатывает цели)
Другой SO спрашивающий спросил, как это сделать БЕЗ xcode, и с ответами, которые сфокусированы на части arm6 vs arm7 - но проигнорировали часть i386: как мне скомпилировать статическую библиотеку (fat) для armv6, armv7 и i386
- Со времени последних изменений Apple часть симулятора больше не похожа на разницу arm6 / arm7 - это другая проблема, см. Выше)
Ответы:
АЛЬТЕРНАТИВЫ:
Простое копирование / вставка последней версии (но инструкции по установке могут измениться - см. Ниже!)
Библиотека Карла требует гораздо больше усилий для установки, но гораздо более приятного долгосрочного решения (оно превращает вашу библиотеку в Framework).
Используйте это, затем настройте его, чтобы добавить поддержку для сборок архива - см. Ниже комментарий cf @ Frederik об изменениях, которые он использует, чтобы эта работа хорошо работала в режиме архива.
ПОСЛЕДНИЕ ИЗМЕНЕНИЯ: 1. Добавлена поддержка iOS 10.x (при сохранении поддержки для старых платформ)
Информация о том, как использовать этот сценарий с проектом, встроенным в другой проект (хотя я настоятельно рекомендую НЕ делать этого, когда-либо - у Apple есть пара ошибок show-stopper в XCode, если вы встраиваете проекты друг в друга из XCode От 3.x до Xcode 4.6.x)
Бонусный скрипт, позволяющий автоматически включать Bundles (т.е. включать файлы PNG, PLIST и т. Д. Из вашей библиотеки!) - см. Ниже (прокрутите вниз)
теперь поддерживает iPhone5 (используя обходной путь Apple к ошибкам в lipo). ПРИМЕЧАНИЕ: инструкции по установке изменились (вероятно, я могу упростить это, изменив скрипт в будущем, но не хочу рисковать сейчас)
Раздел «копировать заголовки» теперь учитывает настройки сборки для расположения общедоступных заголовков (любезно предоставлено Фредериком Уолнером)
Добавлена явная настройка SYMROOT (может быть, нужно установить OBJROOT тоже?), Благодаря Дугу Дикинсону
СЦЕНАРИЙ (это то, что вы должны скопировать / вставить)
Инструкции по использованию / установке см. Ниже
УСТАНОВИТЬ ИНСТРУКЦИИ
... БОНУС ОПЦИОНАЛЬНОГО использования:
Если вы не можете найти выходной файл, вот обходной путь:
Добавьте следующий код в самый конец скрипта (любезно предоставлено Фредериком Валлнером): откройте «$ {CREATING_UNIVERSAL_DIR}»
Apple удаляет весь вывод после 200 строк. Выберите свою цель, и на этапе запуска сценария вы ДОЛЖНЫ снять галочку: «Показывать переменные среды в журнале сборки»
если вы используете пользовательский каталог «build output» для XCode4, то XCode поместит все ваши «неожиданные» файлы в неправильное место.
... это местоположение вашей универсальной сборки.
Как включить файлы «без исходного кода» в ваш проект (PNG, PLIST, XML и т. Д.)
Скрипт для автоматического копирования встроенных пакетов в ту же папку, что и статическая библиотека FAT:
источник
Я потратил много часов, пытаясь создать толстую статическую библиотеку, которая будет работать на armv7, armv7s и симуляторе. Наконец-то нашел решение .
Суть состоит в том, чтобы построить две библиотеки (одну для устройства, а затем для симулятора) по отдельности, переименовать их, чтобы отличать друг от друга, а затем создать их в одной библиотеке.
Я попробовал, и это работает!
источник
Я сделал шаблон проекта XCode 4, который позволяет вам сделать универсальный фреймворк так же легко, как сделать обычную библиотеку.
источник
Существует утилита командной строки,
xcodebuild
и вы можете запустить команду оболочки в xcode. Так что, если вы не возражаете против использования собственного скрипта, этот скрипт может вам помочь.Может быть, выглядит неэффективно (я не очень хорош в сценарии оболочки), но легко понять. Я настроил новую цель, выполняющую только этот скрипт. Скрипт предназначен для командной строки, но не тестируется в :)
Основная концепция - это
xcodebuild
иlipo
.Я пробовал много конфигураций в Xcode UI, но ничего не получалось. Поскольку это разновидность пакетной обработки, поэтому дизайн командной строки больше подходит, поэтому Apple постепенно удалила функцию пакетной сборки из Xcode. Поэтому я не ожидаю, что в будущем они предложат возможность пакетной сборки на основе пользовательского интерфейса.
источник
Мне нужна была толстая статическая библиотека для JsonKit, поэтому я создал проект статической библиотеки в Xcode, а затем запустил этот скрипт bash в каталоге проекта. До тех пор, пока вы настроили проект xcode с отключенным «Build active configuration only», вы должны получить все архитектуры в одной библиотеке.
источник
Обновление IOS 10:
У меня была проблема со сборкой fatlib с iphoneos10.0, потому что регулярное выражение в скрипте ожидает только 9.x и ниже и возвращает 0.0 для ios 10.0
чтобы исправить это просто заменить
с участием
источник
Я превратил это в шаблон Xcode 4 , в том же духе, что и шаблон статического фреймворка Карла.
Я обнаружил, что создание статических структур (вместо простых статических библиотек) вызывало случайные сбои с LLVM из-за явной ошибки компоновщика - так что, я думаю, статические библиотеки все еще полезны!
источник
Прекрасная работа! Я взломал что-то похожее, но пришлось запустить его отдельно. То, что он просто является частью процесса сборки, делает его намного проще.
Один предмет примечания. Я заметил, что он не копирует ни один из включаемых файлов, которые вы помечаете как общедоступные. Я адаптировал то, что у меня было в моем сценарии, к вашему, и оно работает довольно хорошо. Вставьте следующее в конец вашего скрипта.
источник
Я на самом деле просто написал свой сценарий для этой цели. Он не использует Xcode. (Он основан на похожем скрипте в проекте Gambit Scheme.)
По сути, он запускается ./configure и make три раза (для i386, armv7 и armv7s) и объединяет каждую из полученных библиотек в полную библиотеку.
источник