Crie uma biblioteca estática gorda (dispositivo + simulador) usando o Xcode e o SDK 4+

283

Parece que podemos - teoricamente - construir uma única biblioteca estática que inclui o simulador e o iPhone e o iPad.

No entanto, a Apple não possui nenhuma documentação sobre isso que eu possa encontrar, e os modelos padrão do Xcode NÃO estão configurados para fazer isso.

Estou procurando uma técnica simples, portátil e reutilizável que possa ser executada no Xcode.

Alguma história:

  • Em 2008, costumávamos criar libs estáticas únicas que incluíam sim e dispositivo. A Apple desativou isso.
  • Ao longo de 2009, criamos pares de bibliotecas estáticas - uma para sim, outra para dispositivo. A Apple também desativou isso também.

Referências:

  1. Essa é uma ótima idéia, é uma excelente abordagem, mas não funciona: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • Há alguns erros no script dele, o que significa que ele funciona apenas em sua máquina - ele deve estar usando BUILT_PRODUCTS_DIR e / ou BUILD_DIR em vez de "adivinhar" eles)
    • O Xcode mais recente da Apple impede que você faça o que ele fez - ele simplesmente não funcionará, devido à alteração (documentada) na maneira como o Xcode processa os destinos)
  2. Outro questionador do SO perguntou como fazê-lo SEM xcode, e com respostas focadas na parte arm6 versus arm7 - mas ignorou a parte i386: Como compilar uma biblioteca estática (gordura) para armv6, armv7 e i386

    • Desde as últimas mudanças da Apple, a parte do simulador não é mais a mesma diferença arm6 / arm7 - é um problema diferente, veja acima)
Adão
fonte
Apenas me perguntando - por que você quer isso? Não torna a biblioteca de dispositivos maior e mais pesada no dispositivo?
cregox
3
@Cawas - o "peso" da biblioteca é irrelevante em 95% das situações do mundo real - para a maioria de nós, as bibliotecas são pequenas, especialmente em comparação com, por exemplo, exibir apenas uma única UIImageView.
Adam
1
@Cawas - enquanto isso, o valor aqui é que você facilita muito o uso / reutilização de sua biblioteca por outras pessoas. Torna-se um processo de arrastar / soltar em um estágio.
Adam
4
@Cawas - finalmente, um benefício surpreendentemente valioso: é tão fácil enviar acidentalmente a biblioteca compilada "errada" a alguém - o XCode faz zero verificações e compila com prazer a arquitetura "errada" no arquivo nomeado que você achou que estava "correto" arquitetura. A Apple continua quebrando o Xcode nesta área - cada nova versão tem alterações que significam "o botão que você pressionou ontem para compilar sua lib corretamente hoje compila incorretamente". Até que a Apple pare de mexer com a gente, precisamos proteger sua má interface :).
Adam
1
Isso seria realmente ótimo! Porque, no momento, não podemos confiar no simulador para algo um pouco mais complexo.
Cregox

Respostas:

272

ALTERNATIVAS:

Fácil copiar / colar da versão mais recente (mas as instruções de instalação podem mudar - veja abaixo!)

A biblioteca de Karl exige muito mais esforço para configurar, mas uma solução de longo prazo muito melhor (converte sua biblioteca em um Framework).

Use isso e ajuste-o para adicionar suporte para compilações de arquivo morto .


ALTERAÇÕES RECENTES: 1. Adicionado suporte para iOS 10.x (mantendo o suporte para plataformas mais antigas)

  1. Informações sobre como usar esse script com um projeto incorporado em outro projeto (embora eu recomendo NÃO fazer isso, nunca - a Apple tem alguns bugs no Xcode, se você incorporar projetos um no outro, a partir do Xcode 3.x até o Xcode 4.6.x)

  2. Script de bônus para permitir a inclusão automática de pacotes (por exemplo, incluir arquivos PNG, arquivos PLIST etc. da sua biblioteca!) - veja abaixo (role para baixo)

  3. agora suporta iPhone5 (usando a solução da Apple para os erros no lipo). NOTA: as instruções de instalação foram alteradas (provavelmente posso simplificar isso alterando o script no futuro, mas não quero arriscar agora)

  4. A seção "copiar cabeçalhos" agora respeita a configuração de construção para a localização dos cabeçalhos públicos (cortesia de Frederik Wallner)

  5. Adicionado configuração explícita de SYMROOT (talvez também seja necessário definir OBJROOT?), Graças a Doug Dickinson


SCRIPT (é isso que você precisa copiar / colar)

Para instruções de uso / instalação, veja abaixo

##########################################
#
# 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

INSTRUÇÕES DE INSTALAÇÃO

  1. Crie um projeto de lib estático
  2. Selecione o alvo
  3. Na guia "Configurações de compilação", defina "Compilar somente a arquitetura ativa" como "NÃO" (para todos os itens)
  4. Na guia "Fases de construção", selecione "Adicionar ... Nova fase de construção ... Nova fase de construção de script de execução"
  5. Copie / cole o script (acima) na caixa

... Uso opcional de bônus:

  1. OPCIONAL: se você tiver cabeçalhos em sua biblioteca, adicione-os à fase "Copiar cabeçalhos"
  2. OPCIONAL: ... e arraste / solte-os da seção "Projeto" para a seção "Público"
  3. OPCIONAL: ... e eles serão automaticamente exportados toda vez que você criar o aplicativo, em um subdiretório do diretório "debug-universal" (eles estarão em usr / local / include)
  4. OPCIONAL: OBSERVAÇÃO: se você também tentar arrastar / soltar seu projeto em outro projeto do Xcode, isso expõe um bug no Xcode 4, onde não é possível criar um arquivo .IPA se você tiver Cabeçalhos Públicos no seu projeto de arrastar / soltar. A solução alternativa: não incorpore projetos xcode (muitos erros no código da Apple!)

Se você não conseguir encontrar o arquivo de saída, aqui está uma solução alternativa:

  1. Adicione o seguinte código ao final do script (cortesia de Frederik Wallner): abra "$ {CREATING_UNIVERSAL_DIR}"

  2. A Apple exclui toda a saída após 200 linhas. Selecione seu destino e, na fase Executar script, você DEVE desmarcar: "Mostrar variáveis ​​de ambiente no log de construção"

  3. se você estiver usando um diretório "build output" personalizado para o XCode4, o XCode colocará todos os seus arquivos "inesperados" no lugar errado.

    1. Construa o projeto
    2. Clique no último ícone à direita, na área superior esquerda do Xcode4.
    3. Selecione o item principal (esta é a sua "versão mais recente". A Apple deve selecioná-lo automaticamente, mas não pensou nisso)
    4. na janela principal, role para baixo. A última linha deve ler: lipo: para configuração atual (Depuração), criando o arquivo de saída: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... esse é o local do seu Universal Build.


Como incluir arquivos "sem código de origem" em seu projeto (PNG, PLIST, XML, etc)

  1. Faça tudo acima, verifique se funciona
  2. Crie uma nova fase Executar Script que vem APÓS A PRIMEIRA (copie / cole o código abaixo)
  3. Crie um novo destino no Xcode, do tipo "pacote"
  4. No seu PROJETO PRINCIPAL, em "Construir Fases", adicione o novo pacote como algo de que "depende" (seção superior, pressione o botão mais, role para baixo, localize o arquivo ".bundle" nos seus Produtos)
  5. No seu NOVO TARGET DE PACOTE, em "Build Fhases", adicione uma seção "Copy Bundle Resources" e arraste / solte todos os arquivos PNG etc.

Script para copiar automaticamente os pacotes configurados na mesma pasta da sua biblioteca estática 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}"
Adão
fonte
2
Eu usei isso em alguns projetos agora e enviei coisas para a loja de aplicativos que usavam isso para criar as bibliotecas. Tudo funcionou 100% OK, então eu estou furando com isso por enquanto (até Xcode 4, talvez)
Adam
2
Alguém pode confirmar se esse método funciona para o XCode 4.5? Estou tentando compilar uma biblioteca estática e usá-la no meu projeto principal. Eu sou capaz de executar isso no dispositivo, mas não no simulador. Este é o erro que eu recebo: faltando a arquitetura necessária i386 no arquivo /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 fatias)
Alex1987 17/12/1219
2
Alguma idéia de como fazer isso funcionar com o XCode 5 e o ARM64? Se eu deixar as arquiteturas como padrão, elas tornarão a biblioteca com armv7, armvs7 e i386 conforme o esperado. Se eu definir arquiteturas para o padrão, incluindo 64 bits, a biblioteca conterá apenas "cputype 16777223". Eu uso otool -h no arquivo .a para verificar o que está dentro
Roger Binns
1
O XCode5 tornou a adição de uma fase de criação de script de execução ainda mais complicada. confira este: runscriptbuildphase.com
Fabio Napodano
1
Isso parece funcionar bem no Xcode 6 sem alterações (tentei apenas alguns projetos até agora e ainda não enviamos nenhuma atualização da App Store, mas todos estão funcionando bem até agora).
Adam
85

Passei muitas horas tentando criar uma biblioteca estática gorda que funcione nos armv7, armv7s e no simulador. Finalmente encontrei uma solução .

O essencial é criar as duas bibliotecas (uma para o dispositivo e depois uma para o simulador) separadamente, renomeá-las para se distinguirem umas das outras e depois criá-las em uma biblioteca.

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

Eu tentei e funciona!

brilho
fonte
4
Eu sugiro que você leia a resposta aceita. Você pode achar que isso já foi abordado, 2 anos antes ...
Adam
2
Eu li, usei o script, mas não estava funcionando para mim no armv7s.
g_low
2
o comando lipo não funciona no script, mas manualmente funciona muito bem! 10x
Dima 11/03
9
+1 Isso realmente era tudo o que eu precisava, não um script enorme "criar uma estrutura".
LearnCocos2D
Seu SolutionURL retorna "Erro 404 - Não encontrado"
Alex
74

Eu criei um modelo de projeto do XCode 4 que permite criar uma estrutura universal tão facilmente quanto criar uma biblioteca comum.

Karl
fonte
Não foi possível compilá-lo com o destino do iOS 4.3. Obtenha o seguinte erro: destino de implantação inválido para -stdlib = libc ++ (requer iOS 5.0 ou posterior) #
1919 Alex1987
Eu gostaria de poder dar mais pontos de reputação para esta resposta ... muito mais fácil do que usar o CMake para criar uma biblioteca estática. Muito obrigado por fazer isso!
precisa saber é o seguinte
Também funciona com o iOS 6 para mim. Mas talvez seja porque meu lib é bastante simples e sem dependências e recursos
Paulius Vindzigelskis
Há um GRANDE problema com essa solução: outros que desejam usar a estrutura criada por esta solução (esta solução sugere a instalação do modelo fremework no xcode) DEVE instalar esse modelo no SEU xcode !!!
evya 28/09
Você só precisa instalar o modelo para estruturas reais. Estruturas falsas funcionarão bem no Xcode não modificado.
31414 Karl
30

Existe um utilitário de linha de comando xcodebuilde você pode executar o comando shell no xcode. Portanto, se você não se importa em usar um script personalizado, esse script pode ajudá-lo.

#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}"

Talvez pareça ineficiente (não sou bom em shell script), mas fácil de entender. Eu configurei um novo destino executando apenas este script. O script foi projetado para linha de comando, mas não foi testado em :)

O conceito central é xcodebuildelipo .

Eu tentei muitas configurações na interface do Xcode, mas nada funcionou. Como esse é um tipo de processamento em lote, o design da linha de comando é mais adequado e a Apple remove o recurso de criação em lote do Xcode gradualmente. Portanto, não espero que eles ofereçam o recurso de criação de lotes com base na interface do usuário no futuro.

Eonil
fonte
Obrigado, é realmente interessante que os comandos simples subjacentes ainda pareçam funcionar - apenas que a Apple quebrou sua GUI espetacularmente. Parece que eu poderia criar um modelo de projeto totalmente personalizado que "não fosse ruim" e consertar as coisas que a Apple quebrou, pré-fabricando todos os Destinos e conectando esse script com vars de construção do xcode. Vou experimentá-lo no meu próximo projeto :)
Adam
1
Usei um script semelhante a esse e coloquei-o em um novo destino que contém apenas o script de shell. O script de compilação recursiva acima é muito inteligente, mas desnecessariamente confuso.
benzado
1
Eu prefiro scripts de shell para coisas como esta, aqui está a minha opinião gist.github.com/3178578
slf
@benzado Sim, evitei a complexidade intencionalmente porque acho que o shell script deve ser fácil de ler para modificar.
Eonil
lipo: não é possível abrir o arquivo de entrada: / Debug-iphoneos /
Dima
11

Eu precisava de uma lib estática gorda para o JsonKit, então criei um projeto de lib estática no Xcode e executei esse script bash no diretório do projeto. Desde que você tenha configurado o projeto xcode com "Build only configuration active" desativado, você deve obter todas as arquiteturas em uma lib.

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

Atualização do IOS 10:

Eu tive um problema ao criar o fatlib com o iphoneos10.0 porque a expressão regular no script espera apenas 9.xe inferior e retorna 0.0 para o ios 10.0

para corrigir isso basta substituir

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

com

SDK_VERSION=$(echo ${SDK_NAME} | grep -o '[\\.0-9]\{3,4\}$')
ben
fonte
Obrigado. Fiz mudanças semelhantes esta manhã, mas usei \ d. Acho que é esse o que queremos (é melhor ou pior que o seu?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Adam
Eu acho que o meu é mais confiável, uma vez que considera apenas números
ben
1
Não, o seu corresponde a uma maneira específica de escrever dígitos. Dado o suporte histórico da Apple para (e uso de) caracteres e texto pretendidos (por exemplo, nomes de arquivos), eu esperaria que sua seleção proprietária de alguns dígitos fosse menos confiável.
Adam
1
Ok, talvez você esteja certo. pelo menos o meu tenho o meu projeto também trabalhando e estamos seguros para os próximos 89 ios versões
ben
A solução @ben funciona para mim, o regex de Adam '[\\. 0-9] \ {3,4 \} $' fornece o código de erro 2
Zee
4

Eu fiz isso em um modelo Xcode 4 , na mesma linha que o modelo de quadro estático de Karl.

Descobri que a construção de estruturas estáticas (em vez de bibliotecas estáticas simples) estava causando falhas aleatórias no LLVM, devido a um aparente bug no vinculador - então, acho que as bibliotecas estáticas ainda são úteis!

Michael Tyson
fonte
Olá Michael, Eu tentei o seu modelo de biblioteca estática, mas posso compilar para o simulador, mas não para o dispositivo, aqui está o erro: ** BUILD FAILED ** Os seguintes comandos de compilação falharam: ProcessPCH / var / folders / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch falha normal do armv7: ) Mostrando primeiros 200 avisos único comando / bin / sh falhou com código de saída 65
Kappe
2

Bom trabalho! Eu cortei algo semelhante, mas tive que executá-lo separadamente. Só fazer parte do processo de compilação o torna muito mais simples.

Um item de nota. Notei que ele não copia nenhum dos arquivos de inclusão que você marca como público. Eu adaptei o que eu tinha no meu script ao seu e funciona bastante bem. Cole o seguinte no final do seu script.

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
fonte
1
OK, eu adicionei isso à resposta acima. (não tive a oportunidade de testá-lo ainda, mas parece correto para mim)
Adam
1

Na verdade, acabei de escrever meu próprio script para esse fim. Não usa o Xcode. (É baseado em um script semelhante no projeto Gambit Scheme.)

Basicamente, ele roda ./configure e make três vezes (para i386, armv7 e armv7s) e combina cada uma das bibliotecas resultantes em uma lib de gordura.

gritos
fonte