Costruisci libreria statica fat (dispositivo + simulatore) usando Xcode e SDK 4+


283

Sembra che possiamo - teoricamente - costruire una singola libreria statica che includa sia il simulatore che iPhone e iPad.

Tuttavia, Apple non ha documentazione su questo che posso trovare e i modelli predefiniti di Xcode NON sono configurati per farlo.

Sto cercando una tecnica semplice, portatile e riutilizzabile che può essere eseguita all'interno di Xcode.

Un po 'di storia:

  • Nel 2008, eravamo in grado di creare singole librerie statiche che includevano sia sim che device. Apple l'ha disabilitato.
  • Per tutto il 2009, abbiamo creato coppie di librerie statiche: una per sim, una per dispositivo. Anche Apple lo ha disabilitato.

Riferimenti:

  1. Questa è un'ottima idea, è un approccio eccellente, ma non funziona: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

    • Ci sono alcuni bug nel suo script che significa che funziona solo sulla sua macchina - dovrebbe usare BUILT_PRODUCTS_DIR e / o BUILD_DIR invece di "indovinarli")
    • L'ultimo Xcode di Apple ti impedisce di fare ciò che ha fatto - semplicemente non funzionerà, a causa della modifica (documentata) del modo in cui Xcode elabora gli obiettivi)
  2. Un altro interlocutore SO ha chiesto come farlo SENZA xcode e con risposte focalizzate sulla parte arm6 vs arm7 - ma ha ignorato la parte i386: Come posso compilare una libreria statica (fat) per armv6, armv7 e i386

    • Dopo le ultime modifiche di Apple, la parte del simulatore non è più la stessa della differenza arm6 / arm7: è un problema diverso, vedi sopra)

Mi chiedo solo: perché lo vorresti? Non rende la libreria dei dispositivi più grande e più pesante sul dispositivo?
Cregox,

3
@Cawas - il "peso" della libreria è irrilevante nel 95% delle situazioni del mondo reale - per la maggior parte di noi, le librerie sono minuscole, soprattutto se paragonate ad esempio alla visualizzazione di un solo UIImageView.
Adam,

1
@Cawas - nel frattempo, il valore qui è che rendi MOLTO più facile per altre persone usare / riutilizzare la tua libreria. Diventa un processo di trascinamento della selezione in una fase.
Adam,

4
@Cawas - finalmente, un vantaggio sorprendentemente prezioso: è così facile inviare accidentalmente a qualcuno la libreria compilata "sbagliata" - XCode fa zero controlli e compilerà felicemente l'architettura "sbagliata" nel file che pensavi fosse "corretto" architettura. Apple continua a infrangere Xcode in quest'area - ogni nuova versione ha delle modifiche che significano "il pulsante che hai premuto ieri per compilare correttamente la tua lib lo compilerà erroneamente". Fino a quando Apple non smetterà di scherzarci dappertutto, dobbiamo idiotizzare la loro cattiva interfaccia utente :).
Adam,

1
Sarebbe davvero fantastico! Perché in questo momento, non possiamo fare affidamento sul simulatore per qualcosa di un po 'più complesso.
Cregox,

Risposte:


272

ALTERNATIVE:

Facile copia / incolla dell'ultima versione (ma le istruzioni di installazione potrebbero cambiare - vedi sotto!)

La libreria di Karl richiede molto più sforzo per l'installazione, ma una soluzione a lungo termine molto più bella (converte la tua libreria in un Framework).

Usa questo, quindi modificalo per aggiungere il supporto per le build di Archive - vedi il commento di @ Frederik di seguito sulle modifiche che sta usando per farlo funzionare bene con la modalità Archive.


MODIFICHE RECENTI: 1. Aggiunto il supporto per iOS 10.x (mantenendo il supporto per le piattaforme più vecchie)

  1. Informazioni su come utilizzare questo script con un progetto incorporato in un altro progetto (anche se consiglio vivamente di NON farlo, mai - Apple ha un paio di bug di blocco dello spettacolo in Xcode se si incorporano progetti uno dall'altro, da Xcode 3.x fino a Xcode 4.6.x)

  2. Script bonus per permetterti di includere automaticamente i pacchetti (ad esempio includere file PNG, file PLIST ecc. Dalla tua libreria!) - vedi sotto (scorri verso il basso)

  3. ora supporta iPhone5 (usando la soluzione alternativa di Apple ai bug in lipo). NOTA: le istruzioni di installazione sono cambiate (probabilmente posso semplificarlo cambiando lo script in futuro, ma non voglio rischiare ora)

  4. La sezione "copia intestazioni" ora rispetta l'impostazione di costruzione per la posizione delle intestazioni pubbliche (per gentile concessione di Frederik Wallner)

  5. Aggiunta l'impostazione esplicita di SYMROOT (forse è necessario impostare anche OBJROOT?), Grazie a Doug Dickinson


SCRIPT (questo è quello che devi copiare / incollare)

Per le istruzioni di utilizzo / installazione, vedere di seguito

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

ISTRUZIONI PER L'INSTALLAZIONE

  1. Crea un progetto lib statico
  2. Seleziona l'obiettivo
  3. Nella scheda "Crea impostazioni", imposta "Crea solo architettura attiva" su "NO" (per tutti gli elementi)
  4. Nella scheda "Fasi di costruzione", seleziona "Aggiungi ... Nuova fase di costruzione ... Nuova fase di creazione dello script di esecuzione"
  5. Copia / incolla lo script (sopra) nella casella

... Utilizzo OPZIONALE BONUS:

  1. OPZIONALE: se nella libreria sono presenti intestazioni, aggiungerle alla fase "Copia intestazioni"
  2. OPZIONALE: ... e trascinarli dalla sezione "Progetto" alla sezione "Pubblico"
  3. OPZIONALE: ... e verranno esportati AUTOMATICAMENTE ogni volta che compili l'app, in una sottodirectory della directory "debug-universal" (saranno in usr / local / include)
  4. OPZIONALE: NOTA: se si tenta anche di trascinare / rilasciare il progetto in un altro progetto Xcode, questo espone un bug in Xcode 4, dove non è possibile creare un file .IPA se nel progetto di trascinamento / rilascio sono presenti intestazioni pubbliche. La soluzione alternativa: non incorporare progetti xcode (troppi bug nel codice Apple!)

Se non riesci a trovare il file di output, ecco una soluzione alternativa:

  1. Aggiungi il seguente codice alla fine dello script (per gentile concessione di Frederik Wallner): apri "$ {CREATING_UNIVERSAL_DIR}"

  2. Apple elimina tutto l'output dopo 200 righe. Seleziona la tua destinazione e, nella fase Esegui script, DEVI deselezionare: "Mostra variabili di ambiente nel registro build"

  3. se stai usando una directory "build output" personalizzata per XCode4, XCode mette tutti i tuoi file "imprevisti" nella posizione sbagliata.

    1. Costruisci il progetto
    2. Fai clic sull'ultima icona a destra, nell'area in alto a sinistra di Xcode4.
    3. Seleziona l'elemento principale (questa è la tua "build più recente". Apple dovrebbe selezionarlo automaticamente, ma non ci hanno pensato)
    4. nella finestra principale, scorrere verso il basso. L'ultima riga dovrebbe contenere: lipo: per la configurazione corrente (debug) che crea il file di output: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

    ... questa è la posizione della tua build universale.


Come includere file "non sourcecode" nel progetto (PNG, PLIST, XML, ecc.)

  1. Fai tutto quanto sopra, controlla che funzioni
  2. Crea una nuova fase Run Script che arriva DOPO IL PRIMO (copia / incolla il codice qui sotto)
  3. Crea un nuovo Target in Xcode, di tipo "bundle"
  4. Nel tuo PROGETTO PRINCIPALE, in "Crea fasi", aggiungi il nuovo pacchetto come qualcosa da cui "dipende" (sezione superiore, premi il pulsante più, scorri verso il basso, trova il file ".bundle" nei tuoi Prodotti)
  5. Nel tuo NUOVO OBIETTIVO DEL PACCHETTO, in "Crea fasi", aggiungi una sezione "Copia risorse del pacchetto" e trascina / rilascia tutti i file PNG ecc.

Script per copiare automaticamente i bundle creati nella stessa cartella della libreria statica 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
Ho usato questo su alcuni progetti ora e spedito roba nell'app-store che lo usava per costruire le librerie. Tutto ha funzionato al 100% OK, quindi per ora sto rispettando questo (forse fino a Xcode 4)
Adam,

2
Qualcuno può confermare se questo metodo funziona per XCode 4.5? Sto cercando di compilare una libreria statica e usarla nel mio progetto principale. Sono in grado di eseguirlo sul dispositivo ma non sul simulatore. Questo è l'errore che ottengo: manca l'architettura i386 richiesta nel file /Users/alex/Documents/iphone/production/iphone/mymedia/libMyUnrar4iOS.a (2 sezioni)
Alex1987

2
Qualche idea su come farlo funzionare con XCode 5 e ARM64? Se lascio le architetture di serie, rende la libreria con armv7, armvs7 e i386 come previsto. Se imposto architetture su standard compreso 64 bit, la libreria contiene solo "cputype 16777223". Uso otool -h sul file .a per verificare cosa c'è dentro
Roger Binns,

1
XCode5 ha reso ancora più complicata l'aggiunta di una fase di creazione dello script di esecuzione. Dai
Fabio Napodano,

1
Questo sembra funzionare bene su Xcode 6 senza modifiche (finora ho provato solo un paio di progetti e non ho ancora inviato alcun aggiornamento sull'App Store, ma finora funzionano tutti bene).
Adam,

85

Ho trascorso molte ore a cercare di creare una libreria statica che funzionasse su armv7, armv7s e sul simulatore. Finalmente ho trovato una soluzione .

L'essenziale è costruire le due librerie (una per il dispositivo e poi una per il simulatore) separatamente, rinominarle per distinguerle l'una dall'altra, quindi lipo -crearle in una libreria.

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

Ho provato e funziona!


4
Ti suggerisco di leggere la risposta accettata. Potresti scoprire che questo è già stato trattato, 2 anni prima ...
Adam

2
L'ho letto, ho usato la sceneggiatura, ma per armv7s non funzionava.
g_low,

2
il comando lipo non funziona sullo script, ma manualmente funziona alla grande! 10x
Dima

9
+1 Questo era davvero tutto ciò di cui avevo bisogno, non un enorme script "make-a-framework".
LearnCocos2D

La tua soluzioneURL restituisce "Errore 404 - Non trovato"
Alex

74

Ho creato un modello di progetto XCode 4 che consente di creare un framework universale con la stessa facilità con cui si crea una normale libreria.


Impossibile costruirlo con destinazione iOS 4.3. Ottieni il seguente errore: destinazione di distribuzione non valida per -stdlib = libc ++ (richiede iOS 5.0 o successivo)
Alex1987

Vorrei poter dare più punti reputazione per questa risposta ... molto più facile che usare CMake per creare una libreria statica. Grazie mille per averlo fatto!
rapinato il

Funziona anche con iOS 6 per me. Ma forse è perché la mia lib è abbastanza semplice e senza dipendenze e risorse
Paulius Vindzigelskis

C'è un GRANDE problema con quella soluzione: altri che vogliono usare il framework creato da questa soluzione (questa soluzione suggerisce di installare il modello fremework su xcode) DEVE installare questo modello sul LORO xcode !!!
evya,

Hai solo bisogno di installare il modello per framework reali. I framework falsi funzioneranno bene con Xcode non modificato.
Karl,

30

C'è un'utilità da riga di comando xcodebuilded è possibile eseguire il comando shell all'interno di xcode. Quindi, se non ti dispiace usare uno script personalizzato, questo script può aiutarti.

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

Forse sembra inefficiente (non sono bravo con lo script di shell), ma facile da capire. Ho configurato un nuovo target eseguendo solo questo script. Lo script è progettato per la riga di comando ma non testato in :)

Il concetto di base è xcodebuilde lipo.

Ho provato molte configurazioni nell'interfaccia utente di Xcode, ma nulla ha funzionato. Poiché si tratta di una sorta di elaborazione batch, quindi la progettazione della riga di comando è più adatta, quindi Apple ha rimosso gradualmente la funzionalità di generazione batch da Xcode. Quindi non mi aspetto che offriranno funzionalità di generazione batch basate sull'interfaccia utente in futuro.


Grazie, è davvero interessante che i semplici comandi sottostanti sembrano ancora funzionare - è solo che Apple ha rotto la loro GUI in modo spettacolare. Sembra che potrei creare un modello di progetto completamente personalizzato che "non farebbe schifo" e risolverebbe le cose che Apple ha rotto, pre-realizzando tutti i target e collegando questo script con xcode build. Lo proverò sul mio prossimo progetto :)
Adam

1
Ho usato uno script simile a questo e l'ho messo sotto un nuovo target contenente solo lo script della shell. Lo script di build ricorsivo sopra è molto intelligente, ma inutilmente confuso.
benzado,

1
Preferisco gli script di shell per cose come questa, ecco il mio take gist.github.com/3178578
slf

@benzado Sì, ho evitato intenzionalmente la complessità perché penso che lo script della shell debba essere facile da leggere per la modifica.
Eonil,

lipo: impossibile aprire il file di input: / Debug-iphoneos /
Dima

11

Avevo bisogno di una grossa libreria statica per JsonKit, quindi ho creato un progetto di libreria statica in Xcode e quindi ho eseguito questo script bash nella directory del progetto. Finché hai configurato il progetto xcode con "Crea solo configurazione attiva" disattivato, dovresti avere tutte le architetture in un'unica libreria.

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

7

Aggiornamento IOS 10:

Ho avuto un problema con la creazione di fatlib con iphoneos10.0 perché l'espressione regolare nello script prevede solo 9.xe inferiore e restituisce 0.0 per ios 10.0

per risolvere questo basta sostituire

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

con

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

Grazie. Stamattina ho apportato modifiche simili, ma ho usato \ d. Questo penso sia quello che vogliamo (è migliore o peggiore del tuo?) ... grep -o '\ d \ {1,2 \} \. \ D \ {2 \} $'
Adam

Penso che il mio sia più affidabile poiché considera solo numeri
ben

1
No, il tuo corrisponde a un modo particolare di scrivere cifre. Dato il supporto storico di Apple per (e uso di) caratteri e testo preimpostati (ad esempio nei nomi di file), mi aspetto che la selezione proprietaria di alcune cifre sia meno affidabile.
Adam,

1
okay forse hai ragione. almeno il mio ha funzionato anche il mio progetto e siamo al sicuro per le prossime 89 versioni di iOS
ben

La soluzione @ben funziona per me, la regex di Adam "[\\. 0-9] \ {3,4 \} $" fornisce il codice di errore 2
Zee,

4

L'ho trasformato in un modello Xcode 4 , allo stesso modo del modello di quadro statico di Karl.

Ho scoperto che la creazione di framework statici (anziché semplici librerie statiche) stava causando crash casuali con LLVM, a causa di un apparente bug del linker - quindi, immagino che le librerie statiche siano ancora utili!


Ciao Michael, ho provato il tuo modello di libreria statica ma posso compilare per il simulatore ma non per il dispositivo, qui l'errore: ** BUILD FAILED ** I seguenti comandi di build non sono riusciti: ProcessPCH / var / cartelle / qy / ncy6fkpn6677qt876ljrc54m0000gn / C / com .apple.Xcode.501 / SharedPrecompiledHeaders / MenuBarUniversal-Prefix-gwxxzpanxyudmfgryorafazokagi / MenuBarUniversal-Prefix.pch.pth MenuBarUniversal / MenuBarUniversal-Prefix.pch normale armv7 goal-c com.apple.comclang.llm. ) Mostra solo i primi 200 avvisi Comando / bin / sh non riuscito con il codice di uscita 65
Kappe

2

Ottimo lavoro! Ho hackerato insieme qualcosa di simile, ma ho dovuto eseguirlo separatamente. Avere solo parte del processo di compilazione lo rende molto più semplice.

Un elemento degno di nota. Ho notato che non viene copiato su nessuno dei file inclusi che contrassegni come pubblici. Ho adattato quello che avevo nella mia sceneggiatura al tuo e funziona abbastanza bene. Incolla quanto segue alla fine della tua sceneggiatura.

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
OK, l'ho aggiunto alla risposta sopra. (non ho ancora avuto modo di provarlo, ma mi sembra corretto)
Adam

1

In realtà ho appena scritto la mia sceneggiatura per questo scopo. Non usa Xcode. (È basato su uno script simile nel progetto Gambit Scheme.)

Fondamentalmente, esegue ./configure e crea tre volte (per i386, armv7 e armv7s) e combina ognuna delle librerie risultanti in una lib lib.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.