Se pare că putem - teoretic - să construim o singură bibliotecă statică care să includă atât simulator, cât și iPhone și iPad.

Cu toate acestea, Apple nu are nicio documentație pe care să o găsesc, iar șabloanele implicite ale Xcode NU sunt configurate pentru a face acest lucru.

Caut o tehnică simplă, portabilă, reutilizabilă care poate fi realizată în Xcode.

  • În 2008, am fost capabili să realizăm libere statice simple care includeau atât sim, cât și dispozitiv. Apple a dezactivat asta.
  • De-a lungul anului 2009, am realizat perechi de lib-uri statice - una pentru sim, una pentru dispozitiv. Apple a dezactivat și asta.

Aceasta este o idee grozavă, este o abordare excelentă, dar nu funcționează: http://www.drobnik.com/touch/2010/04/universal-static-libraries/

  • Există câteva erori în scriptul său, ceea ce înseamnă că funcționează doar pe mașina sa - ar trebui să folosească BUILT_PRODUCTS_DIR și/sau BUILD_DIR în loc să le „ghicimească”.
  • Cel mai recent Xcode Apple vă împiedică să faceți ceea ce a făcut - pur și simplu nu va funcționa, datorită modificării (documentate) a modului în care Xcode procesează țintele)

Un alt întrebător SO a întrebat cum să o facă FĂRĂ xcode și cu răspunsuri care s-au concentrat pe partea arm6 vs arm7 - dar a ignorat partea i386: Cum compilez o bibliotecă statică (grăsime) pentru armv6, armv7 și i386

  • De la ultimele modificări ale Apple, partea Simulator nu mai este aceeași cu diferența arm6/arm7 - este o problemă diferită, vezi mai sus)

statică

10 Răspunsuri 10

Copiere/lipire ușoară a ultimei versiuni (dar instrucțiunile de instalare se pot modifica - vezi mai jos!)

Biblioteca lui Karl necesită mult mai mult efort pentru configurare, dar o soluție mult mai frumoasă pe termen lung (vă convertește biblioteca într-un Framework).

Utilizați acest lucru, apoi modificați-l pentru a adăuga suport pentru versiunile de arhive - c.f. Comentariul lui @ Frederik de mai jos cu privire la modificările pe care le folosește pentru a face acest lucru să funcționeze frumos cu modul Arhivă.

MODIFICĂRI RECENTE: 1. Adăugat suport pentru iOS 10.x (menținând în același timp suport pentru platforme mai vechi)

Informații despre cum să utilizați acest script cu un proiect încorporat-într-un alt-proiect (deși recomand cu tărie NU să faceți asta, vreodată - Apple are câteva erori show-stopper în Xcode dacă încorporați proiecte unul în celălalt, de la Xcode 3.x până la Xcode 4.6.x)

Script bonus pentru a vă permite să includeți automat pachete (adică să includeți fișiere PNG, fișiere PLIST etc. din biblioteca dvs.!) - consultați mai jos (derulați în jos)

acum acceptă iPhone5 (folosind soluția Apple la bug-urile din lipo). NOTĂ: instrucțiunile de instalare s-au schimbat (probabil că pot simplifica acest lucru schimbând scriptul în viitor, dar nu vreau să-l risc acum)

secțiunea „copiați antetele” respectă acum setările de construcție pentru locația antetelor publice (prin amabilitatea lui Frederik Wallner)

S-a adăugat setarea explicită a SYMROOT (poate că este nevoie și de OBJROOT să fie setat?), Mulțumită lui Doug Dickinson

SCRIPT (acesta este ceea ce trebuie să copiați/lipiți)

Pentru instrucțiuni de utilizare/instalare, consultați mai jos

  1. Creați un proiect lib static
  2. Selectați ținta
  3. În fila „Construiți setări”, setați „Construiți numai arhitectură activă” la „NU” (pentru toate articolele)
  4. În fila „Construiți fazele”, selectați „Adăugați. Fază de construire nouă. Fază de construire a scriptului de rulare nouă”
  5. Copiați/lipiți scriptul (de mai sus) în casetă

. UTILIZARE OPȚIONALĂ A BONUSULUI:

  1. OPȚIONAL: dacă aveți antete în bibliotecă, adăugați-le la faza „Copiere anteturi”
  2. OPȚIONAL:. și glisați-le/fixați-le din secțiunea „Proiect” în secțiunea „Public”
  3. OPȚIONAL:. și vor fi exportate AUTOMAT de fiecare dată când creați aplicația, într-un subdirector al directorului „debug-universal” (vor fi în usr/local/include)
  4. OPȚIONAL: NOTĂ: dacă încercați, de asemenea, să glisați/fixați proiectul într-un alt proiect Xcode, acesta expune o eroare în Xcode 4, unde nu poate crea un fișier .IPA dacă aveți anteturi publice în proiectul dvs. drag/drop. Soluția: nu încorporați proiecte xcode (prea multe erori în codul Apple!)

Dacă nu găsiți fișierul de ieșire, iată o soluție:

Adăugați următorul cod chiar la sfârșitul scriptului (prin amabilitatea lui Frederik Wallner): deschideți „$”

Apple șterge toate ieșirile după 200 de linii. Selectați-vă ținta și, în faza de executare a scriptului, TREBUIE să debifați: „Afișați variabilele de mediu în jurnalul de compilare”

dacă utilizați un director personalizat „build output” pentru XCode4, atunci XCode pune toate fișierele „neașteptate” în locul greșit.

  1. Construiește proiectul
  2. Faceți clic pe ultima pictogramă din dreapta, în zona din stânga sus a Xcode4.
  3. Selectați elementul de sus (aceasta este „cea mai recentă versiune” a dvs. Apple ar trebui să îl selecteze automat, dar nu s-au gândit la asta)
  4. în fereastra principală, derulați până jos. Ultima linie ar trebui să citească: lipo: pentru configurația curentă (Depanare) creând fișierul de ieșire: /Users/blah/Library/Developer/Xcode/DerivedData/AppName-ashwnbutvodmoleijzlncudsekyf/Build/Products/Debug-universal/libTargetName.a

. aceasta este locația construcției dvs. universale.

Cum să includeți fișiere „non-sourcecode” în proiectul dvs. (PNG, PLIST, XML etc.)

  1. Faceți totul de mai sus, verificați dacă funcționează
  2. Creați o nouă fază Run Script care vine DUPĂ PRIMA (copiați/lipiți codul de mai jos)
  3. Creați o nouă țintă în Xcode, de tip „pachet”
  4. În PROIECTUL PRINCIPAL, în „Construiți fazele”, adăugați noul pachet ca ceva de care „depinde” (secțiunea de sus, apăsați butonul plus, derulați în jos, găsiți fișierul „.bundle” în Produsele dvs.)
  5. În NOUA ȚINTĂ DE BUNLE, în „Construiți fazele”, adăugați o secțiune „Copiați resursele pachetului” și trageți/fixați toate fișierele PNG etc.

Script pentru copierea automată a pachetelor încorporate în același folder ca biblioteca statică FAT: