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

283

Похоже, что теоретически мы можем создать единую статическую библиотеку, которая включает в себя как симулятор, так и iPhone и iPad.

Однако у Apple нет документации по этому вопросу, которую я могу найти, и шаблоны Xcode по умолчанию НЕ настроены для этого.

Я ищу простой, портативный, многократно используемый метод, который можно сделать внутри Xcode.

Немного истории:

  • В 2008 году мы имели возможность создавать отдельные статические библиотеки, включающие как сим, так и устройство. Apple отключила это.
  • В течение 2009 года мы делали пары статических библиотек - одну для сима, другую для устройства. Apple теперь тоже отключила это.

Ссылки:

  1. Это отличная идея, это отличный подход, но он не работает: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • В его скрипте есть некоторые ошибки, которые означают, что он работает только на его компьютере - он должен использовать BUILT_PRODUCTS_DIR и / или BUILD_DIR вместо того, чтобы «угадывать» их)
    • Последний Xcode Apple не позволяет вам делать то, что он сделал - это просто не будет работать из-за (документированного) изменения в том, как Xcode обрабатывает цели)
  2. Другой SO спрашивающий спросил, как это сделать БЕЗ xcode, и с ответами, которые сфокусированы на части arm6 vs arm7 - но проигнорировали часть i386: как мне скомпилировать статическую библиотеку (fat) для armv6, armv7 и i386

    • Со времени последних изменений Apple часть симулятора больше не похожа на разницу arm6 / arm7 - это другая проблема, см. Выше)
Адам
источник
Просто интересно - зачем тебе это? Разве это не делает библиотеку устройств больше и тяжелее на устройстве?
cregox
3
@Cawas - «вес» библиотеки не имеет значения в 95% реальных ситуаций - для большинства из нас библиотеки очень маленькие, особенно по сравнению, например, с отображением хотя бы одного UIImageView.
Адам
1
@Cawas - между тем, ценность здесь в том, что вы намного облегчаете другим людям использование / повторное использование вашей библиотеки. Это становится одностадийным процессом перетаскивания.
Адам
4
@Cawas - наконец, удивительно ценное преимущество: очень легко случайно отправить кому-то «неправильную» скомпилированную библиотеку - XCode не проверяет нужды и с радостью скомпилирует «неправильную» архитектуру в названный файл, который вы считаете «правильным» архитектура. Apple продолжает ломать Xcode в этой области - в каждой новой версии есть изменения, которые означают, что «кнопка, которую вы нажали вчера, чтобы правильно скомпилировать вашу библиотеку, сегодня скомпилирует ее неправильно». Пока Apple не перестанет нас обижать, мы должны защищать их идиот от плохого интерфейса :).
Адам
1
Это было бы здорово! Потому что сейчас мы не можем полагаться на симулятор для чего-то более сложного.
Cregox

Ответы:

272

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

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

Библиотека Карла требует гораздо больше усилий для установки, но гораздо более приятного долгосрочного решения (оно превращает вашу библиотеку в Framework).

Используйте это, затем настройте его, чтобы добавить поддержку для сборок архива - см. Ниже комментарий cf @ Frederik об изменениях, которые он использует, чтобы эта работа хорошо работала в режиме архива.


ПОСЛЕДНИЕ ИЗМЕНЕНИЯ: 1. Добавлена ​​поддержка iOS 10.x (при сохранении поддержки для старых платформ)

  1. Информация о том, как использовать этот сценарий с проектом, встроенным в другой проект (хотя я настоятельно рекомендую НЕ делать этого, когда-либо - у Apple есть пара ошибок show-stopper в XCode, если вы встраиваете проекты друг в друга из XCode От 3.x до Xcode 4.6.x)

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

  3. теперь поддерживает iPhone5 (используя обходной путь Apple к ошибкам в lipo). ПРИМЕЧАНИЕ: инструкции по установке изменились (вероятно, я могу упростить это, изменив скрипт в будущем, но не хочу рисковать сейчас)

  4. Раздел «копировать заголовки» теперь учитывает настройки сборки для расположения общедоступных заголовков (любезно предоставлено Фредериком Уолнером)

  5. Добавлена ​​явная настройка SYMROOT (может быть, нужно установить OBJROOT тоже?), Благодаря Дугу Дикинсону


СЦЕНАРИЙ (это то, что вы должны скопировать / вставить)

Инструкции по использованию / установке см. Ниже

##########################################
#
# 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. Создать статический проект lib
  2. Выберите цель
  3. На вкладке «Настройки сборки» установите «Только для активной архитектуры» на «НЕТ» (для всех элементов)
  4. На вкладке «Этапы сборки» выберите «Добавить ... Новая фаза сборки ... Новая фаза сборки скрипта запуска»
  5. Скопируйте / вставьте скрипт (выше) в коробку

... БОНУС ОПЦИОНАЛЬНОГО использования:

  1. ДОПОЛНИТЕЛЬНО: если в вашей библиотеке есть заголовки, добавьте их в фазу «Копировать заголовки»
  2. ДОПОЛНИТЕЛЬНО: ... и перетащите их из раздела «Проект» в раздел «Общий»
  3. ДОПОЛНИТЕЛЬНО: ... и они будут автоматически экспортироваться каждый раз, когда вы создаете приложение, в подкаталог "debug-universal" каталога (они будут в usr / local / include)
  4. ДОПОЛНИТЕЛЬНО: ПРИМЕЧАНИЕ: если вы также пытаетесь перетащить свой проект в другой проект Xcode, это приводит к ошибке в Xcode 4, из-за которой невозможно создать файл .IPA, если в вашем проекте перетаскивания есть открытые заголовки. Обходной путь: не вставляйте проекты xcode (слишком много ошибок в коде Apple!)

Если вы не можете найти выходной файл, вот обходной путь:

  1. Добавьте следующий код в самый конец скрипта (любезно предоставлено Фредериком Валлнером): откройте «$ {CREATING_UNIVERSAL_DIR}»

  2. Apple удаляет весь вывод после 200 строк. Выберите свою цель, и на этапе запуска сценария вы ДОЛЖНЫ снять галочку: «Показывать переменные среды в журнале сборки»

  3. если вы используете пользовательский каталог «build output» для XCode4, то XCode поместит все ваши «неожиданные» файлы в неправильное место.

    1. Построить проект
    2. Нажмите на последний значок справа, в левой верхней части Xcode4.
    3. Выберите верхний элемент (это ваша «самая последняя сборка». Apple должна выбрать ее автоматически, но они об этом не подумали)
    4. в главном окне прокрутите вниз. Самая последняя строка должна выглядеть так:

    ... это местоположение вашей универсальной сборки.


Как включить файлы «без исходного кода» в ваш проект (PNG, PLIST, XML и т. Д.)

  1. Сделай все выше, проверь, работает
  2. Создайте новую фазу Run Script, которая наступит ПОСЛЕ ПЕРВОГО (скопируйте / вставьте код ниже)
  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
среза
2
Любая идея, как заставить это работать с XCode 5 и ARM64? Если я оставлю архитектуры в качестве стандарта, это сделает библиотеку с armv7, armvs7 и i386, как и ожидалось. Если я установлю архитектуру на стандартную, включая 64-битную, то библиотека будет содержать только «cutype 16777223». Я использую otool -h в файле .a, чтобы проверить, что находится внутри
Роджер Биннс
1
XCode5 сделал добавление этапа сборки сценария запуска еще более сложным. проверить это: runcriptbuildphase.com
Фабио Наподано
1
Похоже, что это нормально работает на Xcode 6 без изменений (пока пробовал только пару проектов и еще не отправил обновления App Store, но пока все работает нормально).
Адам
85

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

Суть состоит в том, чтобы построить две библиотеки (одну для устройства, а затем для симулятора) по отдельности, переименовать их, чтобы отличать друг от друга, а затем создать их в одной библиотеке.

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

Я попробовал, и это работает!

g_low
источник
4
Я предлагаю вам прочитать принятый ответ. Вы можете обнаружить, что это уже было покрыто, 2 года назад ...
Адам
2
Я прочитал его, использовал скрипт, но он не работал для меня на armv7s.
g_low
2
команда lipo не работает на скрипте, но вручную работает отлично! 10x
Дима
9
+1 Это было действительно все, что мне было нужно, а не огромный скрипт "make-a-framework".
LearnCocos2D
Ваше SolutionURL возвращение "Ошибка 404 - Not Found"
Alex
74

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

Карл
источник
Не удалось собрать его с целью iOS 4.3. Получите следующую ошибку: недопустимая цель развертывания для -stdlib = libc ++ (требуется iOS 5.0 или более поздняя
версия
Я хотел бы дать больше очков репутации за этот ответ ... намного проще, чем использовать CMake для создания статической библиотеки. Большое вам спасибо за это!
Я был помечен
Это работает также с iOS 6 для меня. Но, может быть, это потому, что моя библиотека довольно проста и без каких-либо зависимостей и ресурсов
Паулюс Виндзигельскис
Существует БОЛЬШАЯ проблема с этим решением: другие, кто хочет использовать платформу, созданную этим решением (это решение предлагает установить шаблон fremework в xcode), ДОЛЖНЫ установить этот шаблон в ИХ xcode !!!
Эвия
Вам нужно только установить шаблон для реальных фреймворков. Поддельные рамки будут работать нормально в неизмененном 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 UI, но ничего не получалось. Поскольку это разновидность пакетной обработки, поэтому дизайн командной строки больше подходит, поэтому Apple постепенно удалила функцию пакетной сборки из Xcode. Поэтому я не ожидаю, что в будущем они предложат возможность пакетной сборки на основе пользовательского интерфейса.

Eonil
источник
Спасибо, действительно интересно, что лежащие в основе простые команды все еще работают - просто Apple эффектно сломала их GUI. Похоже, я мог бы сделать полностью собственный шаблон проекта, который бы «не сосал» и исправлял то, что Apple сломала, предварительно сделав все цели и подключив этот сценарий с помощью сборочных сборок xcode. Я попробую это на моем следующем проекте :)
Адам
1
Я использовал скрипт, похожий на этот, и поместил его под новую цель, содержащую только скрипт оболочки. Вышеуказанный скрипт рекурсивной сборки очень умен, но излишне запутан.
Бензадо
1
Я предпочитаю сценарии оболочки для таких вещей, вот мой дубль gist.github.com/3178578
slf
@benzado Да, я намеренно избегал сложности, потому что я думаю, что сценарий оболочки должен легко читаться для модификации.
Эонил
lipo: не могу открыть входной файл: / Debug-iphoneos /
Дима
11

Мне нужна была толстая статическая библиотека для JsonKit, поэтому я создал проект статической библиотеки в Xcode, а затем запустил этот скрипт bash в каталоге проекта. До тех пор, пока вы настроили проект xcode с отключенным «Build active configuration only», вы должны получить все архитектуры в одной библиотеке.

#!/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:

У меня была проблема со сборкой fatlib с 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 \} $'
Адам
Я думаю, что мой более надежный, поскольку он учитывает только цифры
Бен
1
Нет, ваш соответствует 1 конкретному способу написания цифр. Учитывая историческую поддержку Apple (и использование) предварительно подтвержденных символов и текста (например, в именах файлов), я бы ожидал, что ваш собственный выбор из нескольких цифр будет менее надежным.
Адам
1
хорошо, возможно, ты прав. по крайней мере, мой получил мой проект также работает, и мы в безопасности для следующих 89 версий ios
бен
Решение @ben работает для меня, регулярное выражение Адама '[\\. 0-9] \ {3,4 \} $' дает код ошибки 2
Zee
4

Я превратил это в шаблон Xcode 4 , в том же духе, что и шаблон статического фреймворка Карла.

Я обнаружил, что создание статических структур (вместо простых статических библиотек) вызывало случайные сбои с LLVM из-за явной ошибки компоновщика - так что, я думаю, статические библиотеки все еще полезны!

Майкл Тайсон
источник
Привет, Майкл, я попробовал твой шаблон статической библиотеки, но я могу скомпилировать для симулятора, но не для устройства, здесь ошибка: ** СБОЙ ПОСТРОЕНИЯ ** Сбой следующих команд сборки: ProcessPCH / var / folder / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch, нормальный armv7 target-c. ) Отображение только первых 200 уведомлений Команда / 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
user503821
источник
1
Хорошо, я добавил это к ответу выше. (у меня еще не было возможности проверить это, но мне кажется, это правильно)
Адам
1

Я на самом деле просто написал свой сценарий для этой цели. Он не использует Xcode. (Он основан на похожем скрипте в проекте Gambit Scheme.)

По сути, он запускается ./configure и make три раза (для i386, armv7 и armv7s) и объединяет каждую из полученных библиотек в полную библиотеку.

whooops
источник