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


283

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

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

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

Деякі історії:

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

Список літератури:

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

    • У його сценарії є деякі помилки, що означає, що він працює лише на його машині - він повинен використовувати BUILT_PRODUCTS_DIR та / або BUILD_DIR замість того, щоб "здогадуватися" про них)
    • Найновіший Xcode Apple заважає вам робити те, що він зробив - він просто не працюватиме, через (Документоване) зміна способів обробки коду Xcode)
  2. Інший запитувач ТА запитав, як це зробити БЕЗ xcode та відповідей, які зосереджувалися на частині arm6 vs arm7, але ігнорував частину i386: Як скласти статичну бібліотеку (жир) для armv6, armv7 та i386

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

Просто цікаво - чому ти цього хотів би? Хіба це не робить бібліотеку пристроїв більшими та важчими на пристрої?
Крегокс

3
@Cawas - "вага" бібліотеки не має значення в 95% ситуацій у реальному світі - для більшості з нас мочки крихітні, особливо порівняно, наприклад, із відображенням лише одного єдиного UIImageView.
Адам

1
@Cawas - тим часом значення тут полягає в тому, що ви набагато полегшуєте іншим людям використання / повторне використання вашої бібліотеки. Це стає одноетапним перетягуванням / падінням.
Адам

4
@Cawas - нарешті, напрочуд цінна перевага: так легко випадково надіслати комусь "неправильну" скомпільовану бібліотеку - XCode робить нульові перевірки, і з радістю складе "неправильну" архітектуру в названий файл, який ви вважали "правильним" архітектури. Apple продовжує ламати Xcode у цій області - у кожній новій версії є зміни, які означають, що "кнопка, яку ви вчора натиснули, щоб правильно скомпонувати свою ліб, сьогодні скомпілює її неправильно". Поки Apple не перестане збентежувати нас навколо, нам потрібно ідіотично довести їх поганий інтерфейс :).
Адам

1
Це було б справді чудово! Тому що зараз, як це є, ми просто не можемо розраховувати на тренажер на щось трохи складніше.
Крегокс

Відповіді:


272

АЛЬТЕРНАТИВИ:

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

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

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


ПОСЛІДНІ ЗМІНИ: 1. Додана підтримка iOS 10.x (зберігаючи підтримку для старих платформ)

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

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

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

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

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


SCRIPT (це те, що вам потрібно копіювати / вставляти)

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

##########################################
#
# c.f. /programming/3520977/build-fat-static-library-device-simulator-using-xcode-and-sdk-4
#
# Version 2.82
#
# Latest Change:
# - MORE tweaks to get the iOS 10+ and 9- working
# - Support iOS 10+
# - Corrected typo for iOS 1-10+ (thanks @stuikomma)
# 
# Purpose:
#   Automatically create a Universal static library for iPhone + iPad + iPhone Simulator from within XCode
#
# Author: Adam Martin - http://twitter.com/redglassesapps
# Based on: original script from Eonil (main changes: Eonil's script WILL NOT WORK in Xcode GUI - it WILL CRASH YOUR COMPUTER)
#

set -e
set -o pipefail

#################[ Tests: helps workaround any future bugs in Xcode ]########
#
DEBUG_THIS_SCRIPT="false"

if [ $DEBUG_THIS_SCRIPT = "true" ]
then
echo "########### TESTS #############"
echo "Use the following variables when debugging this script; note that they may change on recursions"
echo "BUILD_DIR = $BUILD_DIR"
echo "BUILD_ROOT = $BUILD_ROOT"
echo "CONFIGURATION_BUILD_DIR = $CONFIGURATION_BUILD_DIR"
echo "BUILT_PRODUCTS_DIR = $BUILT_PRODUCTS_DIR"
echo "CONFIGURATION_TEMP_DIR = $CONFIGURATION_TEMP_DIR"
echo "TARGET_BUILD_DIR = $TARGET_BUILD_DIR"
fi

#####################[ part 1 ]##################
# First, work out the BASESDK version number (NB: Apple ought to report this, but they hide it)
#    (incidental: searching for substrings in sh is a nightmare! Sob)

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '\d\{1,2\}\.\d\{1,2\}$')

# Next, work out if we're in SIM or DEVICE

if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
OTHER_SDK_TO_BUILD=iphoneos${SDK_VERSION}
else
OTHER_SDK_TO_BUILD=iphonesimulator${SDK_VERSION}
fi

echo "XCode has selected SDK: ${PLATFORM_NAME} with version: ${SDK_VERSION} (although back-targetting: ${IPHONEOS_DEPLOYMENT_TARGET})"
echo "...therefore, OTHER_SDK_TO_BUILD = ${OTHER_SDK_TO_BUILD}"
#
#####################[ end of part 1 ]##################

#####################[ part 2 ]##################
#
# IF this is the original invocation, invoke WHATEVER other builds are required
#
# Xcode is already building ONE target...
#
# ...but this is a LIBRARY, so Apple is wrong to set it to build just one.
# ...we need to build ALL targets
# ...we MUST NOT re-build the target that is ALREADY being built: Xcode WILL CRASH YOUR COMPUTER if you try this (infinite recursion!)
#
#
# So: build ONLY the missing platforms/configurations.

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: I am NOT the root invocation, so I'm NOT going to recurse"
else
# CRITICAL:
# Prevent infinite recursion (Xcode sucks)
export ALREADYINVOKED="true"

echo "RECURSION: I am the root ... recursing all missing build targets NOW..."
echo "RECURSION: ...about to invoke: xcodebuild -configuration \"${CONFIGURATION}\" -project \"${PROJECT_NAME}.xcodeproj\" -target \"${TARGET_NAME}\" -sdk \"${OTHER_SDK_TO_BUILD}\" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO" BUILD_DIR=\"${BUILD_DIR}\" BUILD_ROOT=\"${BUILD_ROOT}\" SYMROOT=\"${SYMROOT}\"

xcodebuild -configuration "${CONFIGURATION}" -project "${PROJECT_NAME}.xcodeproj" -target "${TARGET_NAME}" -sdk "${OTHER_SDK_TO_BUILD}" ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" SYMROOT="${SYMROOT}"

ACTION="build"

#Merge all platform binaries as a fat binary for each configurations.

# Calculate where the (multiple) built files are coming from:
CURRENTCONFIG_DEVICE_DIR=${SYMROOT}/${CONFIGURATION}-iphoneos
CURRENTCONFIG_SIMULATOR_DIR=${SYMROOT}/${CONFIGURATION}-iphonesimulator

echo "Taking device build from: ${CURRENTCONFIG_DEVICE_DIR}"
echo "Taking simulator build from: ${CURRENTCONFIG_SIMULATOR_DIR}"

CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
echo "...I will output a universal build to: ${CREATING_UNIVERSAL_DIR}"

# ... remove the products of previous runs of this script
#      NB: this directory is ONLY created by this script - it should be safe to delete!

rm -rf "${CREATING_UNIVERSAL_DIR}"
mkdir "${CREATING_UNIVERSAL_DIR}"

#
echo "lipo: for current configuration (${CONFIGURATION}) creating output file: ${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}"
xcrun -sdk iphoneos lipo -create -output "${CREATING_UNIVERSAL_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_DEVICE_DIR}/${EXECUTABLE_NAME}" "${CURRENTCONFIG_SIMULATOR_DIR}/${EXECUTABLE_NAME}"

#########
#
# Added: StackOverflow suggestion to also copy "include" files
#    (untested, but should work OK)
#
echo "Fetching headers from ${PUBLIC_HEADERS_FOLDER_PATH}"
echo "  (if you embed your library project in another project, you will need to add"
echo "   a "User Search Headers" build setting of: (NB INCLUDE THE DOUBLE QUOTES BELOW!)"
echo '        "$(TARGET_BUILD_DIR)/usr/local/include/"'
if [ -d "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}" ]
then
mkdir -p "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
# * needs to be outside the double quotes?
cp -r "${CURRENTCONFIG_DEVICE_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"* "${CREATING_UNIVERSAL_DIR}${PUBLIC_HEADERS_FOLDER_PATH}"
fi
fi

ВСТАНОВИТИ ІНСТРУКЦІЇ

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

... БОНУСОВЕ ОПЦІЙНЕ використання:

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

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

  1. Додайте наступний код у самому кінці сценарію (люб’язно Фредерік Валнер): відкрийте "$ {CREATING_UNIVERSAL_DIR}"

  2. Apple видаляє весь вихід після 200 рядків. Виберіть ціль, і у фазі запустити сценарій ОБОВ'ЯЗКОВО зняти: "Показати змінні середовища у журналі складання"

  3. якщо ви використовуєте користувальницький каталог "збірка результатів" для 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 типу "пакет"
  4. У свій ОСНОВНИЙ ПРОЕКТ у розділі "Фази збірки" додайте новий пакет як щось, від чого "залежить" (верхній розділ, натисніть кнопку плюс, прокрутіть донизу, знайдіть файл ".bundle" у своїх продуктах)
  5. У вашій НОВІЙ ЦІЛІ БУНДУ в розділі "Фази збірки" додайте розділ "Копіювати ресурси ресурсу" та перетягніть у нього всі файли PNG тощо.

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

echo "RunScript2:"
echo "Autocopying any bundles into the 'universal' output folder created by RunScript1"
CREATING_UNIVERSAL_DIR=${SYMROOT}/${CONFIGURATION}-universal
cp -r "${BUILT_PRODUCTS_DIR}/"*.bundle "${CREATING_UNIVERSAL_DIR}"

2
Зараз я використовував це в декількох проектах і відправляв речі до магазину додатків, який використовував це для створення бібліотек. Все працювало на 100% гаразд, тому я зараз дотримуюся цього (до Xcode 4, можливо)
Адам,

2
Чи може хто-небудь підтвердити, чи працює цей метод для XCode 4.5? Я намагаюся скласти статичну бібліотеку і використовувати її в своєму головному проекті. Я можу запустити це на пристрої, але не на тренажері. Це помилка, яку я отримую: відсутня необхідна архітектура i386 у файлі /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 фрагменти)
Alex1987

2
Будь-яка ідея, як зробити цю роботу з XCode 5 і ARM64? Якщо я залишу архітектури як стандартні, це робить бібліотеку з armv7, armvs7 та i386, як очікувалося. Якщо я встановив архітектури стандартними, включаючи 64-бітові, то бібліотека містить лише "cputype 16777223". Я використовую otool -h у файлі .a, щоб перевірити, що знаходиться всередині
Roger Binns

1
XCode5 зробив додавання фази збірки сценарію запуску ще більш складним. перевірити це: runcriptbuildphase.com
Фабіо Наподано

1
Схоже, це добре працює на Xcode 6 без змін (лише пробували декілька проектів досі, і ще не надсилали жодних оновлень App Store, але поки що всі працюють нормально).
Адам

85

Я витратив багато годин, намагаючись створити жирну статичну бібліотеку, яка буде працювати над armv7, armv7s та тренажером. Нарешті знайшов рішення .

Суть полягає в тому, щоб скласти дві бібліотеки (одну для пристрою, а потім одну для тренажера) окремо, перейменувати їх, щоб відрізнити одна від одної, а потім lipo-створити їх в одну бібліотеку.

lipo -create libPhone.a libSimulator.a -output libUniversal.a

Я спробував це і працює!


4
Я пропоную прочитати прийняту відповідь. Ви можете виявити, що це вже було висвітлено, 2 роки раніше ...
Адам

2
Я прочитав його, використав сценарій, але він не працював для armv7s.
g_low

2
команда lipo не працює над сценарієм, але вручну це чудово працює! 10x
Діма

9
+1 Це було дійсно все, що мені потрібно, а не величезний сценарій "make-a-frame".
LearnCocos2D

Ваше рішенняURL повернення "Помилка 404 - не знайдено"
Алекс

74

Я створив шаблон проекту XCode 4, який дозволяє вам зробити універсальний фреймворк так само просто, як зробити звичайну бібліотеку.


Неможливо створити його за допомогою iOS 4.3 target. Отримайте таку помилку: недійсна ціль розгортання для -stdlib = libc ++ (потрібна iOS 5.0 або пізнішої версії)
Alex1987

Я б хотів, щоб я міг дати більше балів репутації за цю відповідь ... набагато простіше, ніж використовувати CMake для створення статичної бібліотеки. Дуже дякую вам за це!
iwasrobbed

Він також працює для iOS 6. Але, можливо, це тому, що моя вія досить проста і без будь-яких залежностей і ресурсів
Паулій Віндзігельскіс

Є велика проблема з цим рішенням: інші, хто хоче використовувати рамку, створену цим рішенням (це рішення пропонує встановити шаблон фреймворку для xcode), ПОВИНЕН Встановити цей шаблон до ЇХ xcode !!!
evya

Вам потрібно лише встановити шаблон для реальних рамок. Підроблені рамки будуть нормально працювати в немодифікованому Xcode.
Карл

30

Існує утиліта командного рядка, xcodebuildі ви можете запускати команду оболонки в межах xcode. Отже, якщо ви не заперечуєте з використанням користувацького сценарію, цей скрипт може вам допомогти.

#Configurations.
#This script designed for Mac OS X command-line, so does not use Xcode build variables.
#But you can use it freely if you want.

TARGET=sns
ACTION="clean build"
FILE_NAME=libsns.a

DEVICE=iphoneos3.2
SIMULATOR=iphonesimulator3.2






#Build for all platforms/configurations.

xcodebuild -configuration Debug -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Debug -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${DEVICE} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO
xcodebuild -configuration Release -target ${TARGET} -sdk ${SIMULATOR} ${ACTION} RUN_CLANG_STATIC_ANALYZER=NO







#Merge all platform binaries as a fat binary for each configurations.

DEBUG_DEVICE_DIR=${SYMROOT}/Debug-iphoneos
DEBUG_SIMULATOR_DIR=${SYMROOT}/Debug-iphonesimulator
DEBUG_UNIVERSAL_DIR=${SYMROOT}/Debug-universal

RELEASE_DEVICE_DIR=${SYMROOT}/Release-iphoneos
RELEASE_SIMULATOR_DIR=${SYMROOT}/Release-iphonesimulator
RELEASE_UNIVERSAL_DIR=${SYMROOT}/Release-universal

rm -rf "${DEBUG_UNIVERSAL_DIR}"
rm -rf "${RELEASE_UNIVERSAL_DIR}"
mkdir "${DEBUG_UNIVERSAL_DIR}"
mkdir "${RELEASE_UNIVERSAL_DIR}"

lipo -create -output "${DEBUG_UNIVERSAL_DIR}/${FILE_NAME}" "${DEBUG_DEVICE_DIR}/${FILE_NAME}" "${DEBUG_SIMULATOR_DIR}/${FILE_NAME}"
lipo -create -output "${RELEASE_UNIVERSAL_DIR}/${FILE_NAME}" "${RELEASE_DEVICE_DIR}/${FILE_NAME}" "${RELEASE_SIMULATOR_DIR}/${FILE_NAME}"

Можливо, виглядає неефективно (мені не добре в скрипті оболонки), але легко зрозуміти. Я налаштував нову ціль, на якій працює лише цей сценарій. Сценарій розроблений для командного рядка, але не перевіряється :)

Основна концепція - xcodebuildі lipo.

Я спробував багато конфігурацій в інтерфейсі Xcode, але нічого не вийшло. Тому що це свого роду пакетна обробка, тому дизайн командного рядка є більш підходящим, тому Apple поступово видаляла функцію збирання пакетів з Xcode. Тому я не сподіваюсь, що вони надалі пропонують функцію створення пакетної збірки на основі інтерфейсу.


Дякую, насправді цікаво, що основні прості команди все ще працюють - це просто те, що Apple ефектно розбила їх GUI. Схоже, я міг би створити повністю користувальницький шаблон проекту, який би "не смоктав" і не виправляв те, що Apple зламав, попередньо зробивши всі Цілі та з'єднавши цей сценарій з використанням xcode build vars. Я спробую це на своєму наступному проекті :)
Адам,

1
Я використав подібний до цього сценарій і поставив його під новою ціллю, що містить лише сценарій оболонки. Сценарій рекурсивної збірки вище є дуже розумним, але зайвим заплутаним.
бензадо

1
Я віддаю перевагу скриптам оболонки для таких матеріалів, ось мій беруть gist.github.com/3178578
slf

@benzado Так, я навмисно уникнув складності, оскільки думаю, що сценарій оболонки повинен легко читатися для зміни.
Еоніл

lipo: не вдається відкрити вхідний файл: / Debug-iphoneos /
Діма

11

Мені знадобилася жирова статична lib для JsonKit, тому я створив проект статичної lib у Xcode, а потім запустив цей скрипт bash у каталог проектів. Поки ви конфігурували проект xcode із вимкненою функцією "Тільки активна конфігурація", ви повинні отримати всі архітектури в одному файлі.

#!/bin/bash
xcodebuild -sdk iphoneos
xcodebuild -sdk iphonesimulator
lipo -create -output libJsonKit.a build/Release-iphoneos/libJsonKit.a build/Release-iphonesimulator/libJsonKit.a

7

Оновлення IOS 10:

У мене виникли проблеми зі створенням жирової панелі за допомогою iphoneos10.0, оскільки регулярний вираз у сценарії очікує лише 9.x та нижче та повертає 0.0 для ios 10.0

щоб виправити це, просто замініть

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '.\{3\}$')

з

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')

Дякую. Я зробив подібні зміни сьогодні вранці, але використовував \ d. Це я думаю, що ми хочемо (він кращий чи гірший, ніж ваш?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Адам,

Я вважаю, що міна є більш надійною, оскільки вона вважає лише числа
ben

1
Ні, ваша відповідність одному конкретному способу написання цифр. З огляду на історичну підтримку Apple (та використання) попередньо введених символів та тексту (наприклад, у назви файлів), я б очікував, що ваш власний вибір кількох цифр буде менш надійним.
Адам

1
добре, може, ти маєш рацію. принаймні, мій проект також працював, і ми готові до наступних версій 89 ios
ben

Для мене працює рішення @ben, вираз Адама '[\\. 0-9] \ {3,4 \} $' дає код помилки 2
Zee

4

Я зробив це в шаблон Xcode 4 , в тому ж дусі, що і шаблон статичного каркалу Карла.

Я виявив, що побудова статичних фреймворків (замість звичайних статичних бібліотек) спричиняє випадкові збої з LLVM через очевидну помилку лінкера - так, я думаю, статичні бібліотеки все ще корисні!


Привіт Майкл, я спробував ваш шаблон статичної бібліотеки, але я можу компілювати для імітатора, але не для пристрою, тут помилка: ** BUILD FAILED ** Наступні команди збірки не вдалися: ProcessPCH / var / folders / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch нормальний armv7 aim-c com.apple.comcla.com (1px.pile.compila) ) Показ перших 200 повідомлень лише Command / bin / sh не вдалося з кодом виходу 65
Kappe

2

Чудова робота! Я зламав разом щось подібне, але довелося запускати це окремо. Наявність його просто частиною процесу збирання робить його набагато простішим.

Один предмет примітки. Я помітив, що він не копіює жоден із файлів включення, які ви позначаєте як загальнодоступні. Я адаптував те, що було в моєму сценарії, до вашого, і це працює досить добре. Вставте наступне до кінця сценарію.

if [ -d "${CURRENTCONFIG_DEVICE_DIR}/usr/local/include" ]
then
  mkdir -p "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
  cp "${CURRENTCONFIG_DEVICE_DIR}"/usr/local/include/* "${CURRENTCONFIG_UNIVERSAL_DIR}/usr/local/include"
fi

1
Гаразд, я додав це до відповіді вище. (у мене ще не було можливості протестувати це, але мені здається правильно)
Адам

1

Я фактично просто написав для цього свій власний сценарій . Він не використовує Xcode. (Він заснований на подібному сценарії в проекті Gambit Scheme.)

В основному, він працює ./configure та робить три рази (для i386, armv7 та armv7s) та об'єднує кожну з отриманих бібліотек у жирну лібку.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.