Створіть статичну бібліотеку жиру (пристрій + симулятор), використовуючи Xcode та SDK 4+

Здається, ми можемо - теоретично - створити єдину статичну бібліотеку, яка включає як симулятор, так і iPhone та iPad.

Однак Apple не має жодної документації з цього приводу, яку я можу знайти, і шаблони Xcode за замовчуванням НЕ налаштовані для цього.

Я шукаю просту, портативну, повторно використовувану техніку, яку можна зробити всередині Xcode.

  • У 2008 році ми мали змогу створювати одинарні статичні бібліотеки, які включали як sim, так і пристрій. Apple вимкнула це.
  • Протягом 2009 року ми створили пари статичних бібліотек - одну для sim, одну для пристрою. Apple відключила і це.

Це чудова ідея, це чудовий підхід, але він не працює: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

  • У його сценарії є деякі помилки, що означає, що це працює лише на його машині - він повинен використовувати BUILT_PRODUCTS_DIR та/або BUILD_DIR замість того, щоб "вгадувати" їх)
  • Останній Xcode від Apple заважає робити те, що він робив - він просто не працюватиме через (документовану) зміну способу обробки цілей Xcode)

Інший запитувач SO запитав, як це зробити БЕЗ xcode та з відповідями, які зосереджувались на частині arm6 проти arm7 - але ігнорував частину i386: Як скомпілювати статичну бібліотеку (жир) для armv6, armv7 та i386

  • Оскільки останні зміни Apple, частина Simulator вже не така, як різниця arm6/arm7 - це інша проблема, див. Вище)

створіть

10 відповідей 10

Просте копіювання/вставлення останньої версії (але інструкції з встановлення можуть змінитися - див. Нижче!)

Бібліотека Карла вимагає набагато більше зусиль для налаштування, але набагато приємніше довгострокове рішення (вона перетворює вашу бібліотеку у фреймворк).

Використовуйте це, а потім налаштуйте його, щоб додати підтримку для збірок архіву - c.f. Коментар @ Frederik нижче про зміни, які він використовує, щоб зробити цю роботу приємно в режимі архіву.

НОВІ ЗМІНИ: 1. Додана підтримка iOS 10.x (при збереженні підтримки для старих платформ)

Інформація про те, як використовувати цей скрипт із вбудованим в проект іншим проектом (хоча я настійно рекомендую цього НЕ робити - коли-небудь - Apple має кілька помилок шоу-пробок у Xcode, якщо ви вбудовуєте проекти один в одного, з Xcode 3.x до Xcode 4.6.x)

Бонусний сценарій, який дозволяє автоматично включати набори (тобто включати файли PNG, файли PLIST тощо з вашої бібліотеки!) - див. Нижче (прокрутіть унизу)

тепер підтримує iPhone5 (використовуючи обхідне рішення Apple щодо помилок у lipo). ПРИМІТКА: інструкції з встановлення змінилися (я, можливо, можу спростити це, змінивши сценарій у майбутньому, але не хочу зараз ризикувати)

Розділ "копіювати заголовки" тепер поважає параметри побудови розташування загальнодоступних заголовків (люб'язно надано Фредеріком Валнером)

Додано явне налаштування SYMROOT (можливо, потрібно також встановити OBJROOT?), Завдяки Дугу Дікінсону

СЦЕНАРІЙ (це те, що вам потрібно скопіювати/вставити)

Інструкції щодо використання/встановлення див. Нижче

  1. Створіть статичний проект lib
  2. Виберіть Ціль
  3. На вкладці "Налаштування збірки" встановіть значення "Створення лише активної архітектури" на "НІ" (для всіх елементів)
  4. На вкладці "Фази збірки" виберіть "Додати. Нова фаза збірки. Нова фаза збірки сценарію запуску"
  5. Скопіюйте/вставте сценарій (вгорі) у поле

. НЕОБОВ’ЯЗКОВЕ використання:

  1. НЕОБОВ'ЯЗКОВО: якщо у вашій бібліотеці є заголовки, додайте їх до фази "Копіювати заголовки"
  2. НЕОБЯЖНО:. і перетягніть їх із розділу "Проект" у розділ "Загальнодоступний"
  3. НЕОБЯЖНО:. і вони АВТОМАТИЧНО експортуватимуться кожного разу, коли ви створюєте додаток, у підкаталог каталогу "debug-universal" (вони будуть у usr/local/include)
  4. НЕОБОВ’ЯЗКОВО: ПРИМІТКА: якщо ви також спробуєте перетягнути/перетягнути свій проект в інший проект Xcode, це виявить помилку в Xcode 4, де він не зможе створити файл .IPA, якщо у вашому проекті перетягування/скидання є загальнодоступні заголовки. Вирішення проблеми: не вбудовуйте проекти xcode (занадто багато помилок у коді Apple!)

Якщо ви не можете знайти вихідний файл, ось обхідний шлях:

Додайте наступний код до самого кінця сценарію (люб'язно надано Фредеріком Валнером): відкрийте "$"

Apple видаляє всі дані через 200 рядків. Виберіть ціль, і на етапі запуску сценарію ви ПОВИННІ зняти позначку: "Показати змінні середовища в журналі побудови"

якщо ви використовуєте спеціальний каталог "build output" для XCode4, тоді XCode поміщає всі ваші "несподівані" файли в неправильне місце.

  1. Побудуйте проект
  2. Клацніть на останній значок праворуч, у верхній лівій області Xcode4.
  3. Виділіть верхній елемент (це ваша "остання збірка". Apple повинна вибрати його автоматично, але вони про це не думали)
  4. у головному вікні прокрутіть донизу. Останній рядок повинен читати: lipo: для поточної конфігурації (Налагодження) створення вихідного файлу: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

. це місце розташування вашої Universal Build.

Як включити у свій проект файли, що не мають вихідного коду (PNG, PLIST, XML тощо)

  1. Виконайте все вище, перевірте, чи працює
  2. Створіть новий етап запуску сценарію, який настає ПІСЛЯ ПЕРШОГО (скопіюйте/вставте код нижче)
  3. Створіть нову ціль у Xcode типу "bundle"
  4. У своєму ГОЛОВНОМУ ПРОЕКТІ, у розділі "Фази побудови", додайте новий комплект як щось, від чого це "залежить" (верхній розділ, натисніть кнопку плюса, прокрутіть униз, знайдіть файл ".bundle" у своїх продуктах)
  5. У свою НОВУ ЦІЛЬОВУ ЦІЛЬ, у розділі "Фази побудови", додайте розділ "Копіювати ресурси пакета" та перетягніть у нього всі файли PNG тощо.

Сценарій для автоматичного копіювання вбудованих пакетів у ту саму папку, що і ваша статична бібліотека FAT: