Es scheint, dass wir theoretisch eine einzige statische Bibliothek erstellen können, die sowohl Simulator als auch iPhone und iPad enthält.
Apple hat jedoch keine Dokumentation dazu, die ich finden kann, und die Standardvorlagen von Xcode sind NICHT dafür konfiguriert.
Ich suche nach einer einfachen, tragbaren und wiederverwendbaren Technik, die in Xcode ausgeführt werden kann.
Einige Geschichten:
- Im Jahr 2008 konnten wir einzelne statische Bibliotheken erstellen, die sowohl Sim als auch Gerät enthielten. Apple hat das deaktiviert.
- Im Laufe des Jahres 2009 haben wir Paare statischer Bibliotheken erstellt - eine für Sim, eine für Geräte. Apple hat das jetzt auch deaktiviert.
Verweise:
Dies ist eine großartige Idee, ein ausgezeichneter Ansatz, der jedoch nicht funktioniert: http://www.drobnik.com/touch/2010/04/universal-static-libraries/
- Es gibt einige Fehler in seinem Skript, die bedeuten, dass es nur auf seinem Computer funktioniert - er sollte BUILT_PRODUCTS_DIR und / oder BUILD_DIR verwenden, anstatt sie zu "schätzen".
- Apples neuester Xcode verhindert, dass Sie das tun, was er getan hat - er funktioniert einfach nicht, da sich die (dokumentierte) Änderung der Art und Weise, wie Xcode Ziele verarbeitet, geändert hat.
Ein anderer SO-Fragesteller fragte, wie es OHNE xcode und mit Antworten gemacht werden soll, die sich auf den Teil arm6 vs arm7 konzentrierten - ignorierte jedoch den Teil i386: Wie kompiliere ich eine statische Bibliothek (Fett) für armv6, armv7 und i386
- Seit den letzten Änderungen von Apple ist der Simulator-Teil nicht mehr derselbe wie der Unterschied zwischen arm6 und arm7 - es ist ein anderes Problem, siehe oben)
Antworten:
ALTERNATIVEN:
Einfaches Kopieren / Einfügen der neuesten Version (die Installationsanweisungen können sich jedoch ändern - siehe unten!)
Die Einrichtung von Karls Bibliothek erfordert viel mehr Aufwand, aber eine viel schönere langfristige Lösung (sie konvertiert Ihre Bibliothek in ein Framework).
Verwenden Sie diese Option und optimieren Sie sie, um Unterstützung für Archiv-Builds hinzuzufügen. Siehe @ Frederiks Kommentar unten zu den Änderungen, die er verwendet, damit dies im Archivierungsmodus gut funktioniert.
JÜNGSTE ÄNDERUNGEN: 1. Unterstützung für iOS 10.x hinzugefügt (während die Unterstützung für ältere Plattformen beibehalten wird)
Informationen zur Verwendung dieses Skripts mit einem Projekt, das in ein anderes Projekt eingebettet ist (obwohl ich dringend empfehle, dies niemals zu tun - Apple hat ein paar Show-Stopper-Fehler in Xcode, wenn Sie Projekte von Xcode ineinander einbetten 3.x bis Xcode 4.6.x)
Bonusskript, mit dem Sie Bundles automatisch einschließen können (dh PNG-Dateien, PLIST-Dateien usw. aus Ihrer Bibliothek einschließen!) - siehe unten (nach unten scrollen)
unterstützt jetzt das iPhone5 (mit Apples Problemumgehung für die Fehler in Lipo). HINWEIS: Die Installationsanweisungen haben sich geändert (ich kann dies wahrscheinlich vereinfachen, indem ich das Skript in Zukunft ändere, möchte es aber jetzt nicht riskieren).
Der Abschnitt "Header kopieren" berücksichtigt jetzt die Build-Einstellung für den Speicherort der öffentlichen Header (mit freundlicher Genehmigung von Frederik Wallner).
Dank Doug Dickinson wurde die explizite Einstellung von SYMROOT hinzugefügt (muss möglicherweise auch OBJROOT eingestellt werden?)
SCRIPT (das müssen Sie kopieren / einfügen)
Anweisungen zur Verwendung / Installation finden Sie unten
INSTALLATIONSANWEISUNGEN
... BONUS OPTIONALE Verwendung:
Wenn Sie die Ausgabedatei nicht finden können, finden Sie hier eine Problemumgehung:
Fügen Sie den folgenden Code ganz am Ende des Skripts hinzu (mit freundlicher Genehmigung von Frederik Wallner): open "$ {CREATING_UNIVERSAL_DIR}"
Apple löscht alle Ausgaben nach 200 Zeilen. Wählen Sie Ihr Ziel aus und in der Phase "Skript ausführen" MÜSSEN Sie das Kontrollkästchen "Umgebungsvariablen im Erstellungsprotokoll anzeigen" deaktivieren.
Wenn Sie ein benutzerdefiniertes "Build Output" -Verzeichnis für XCode4 verwenden, legt XCode alle Ihre "unerwarteten" Dateien am falschen Ort ab.
... das ist der Ort Ihres Universal Builds.
So fügen Sie "Nicht-Quellcode" -Dateien in Ihr Projekt ein (PNG, PLIST, XML usw.)
Skript zum automatischen Kopieren der erstellten Bundles in denselben Ordner wie Ihre statische FAT-Bibliothek:
quelle
Ich habe viele Stunden damit verbracht, eine fette statische Bibliothek zu erstellen, die mit armv7, armv7s und dem Simulator funktioniert. Endlich eine Lösung gefunden .
Das Wesentliche ist, die beiden Bibliotheken (eine für das Gerät und eine für den Simulator) getrennt zu erstellen, sie umzubenennen, um sie voneinander zu unterscheiden, und sie dann in einer Bibliothek zu erstellen.
Ich habe es versucht und es funktioniert!
quelle
Ich habe eine XCode 4-Projektvorlage erstellt , mit der Sie ein universelles Framework genauso einfach erstellen können wie mit einer regulären Bibliothek.
quelle
Es gibt ein Befehlszeilenprogramm,
xcodebuild
und Sie können den Shell-Befehl in xcode ausführen. Wenn es Ihnen nichts ausmacht, ein benutzerdefiniertes Skript zu verwenden, kann Ihnen dieses Skript helfen.Sieht vielleicht ineffizient aus (ich bin nicht gut im Shell-Skript), aber leicht zu verstehen. Ich habe ein neues Ziel konfiguriert, auf dem nur dieses Skript ausgeführt wird. Das Skript ist für die Befehlszeile konzipiert, aber nicht in :) getestet
Das Kernkonzept ist
xcodebuild
undlipo
.Ich habe viele Konfigurationen innerhalb der Xcode-Benutzeroberfläche ausprobiert, aber nichts hat funktioniert. Da dies eine Art Stapelverarbeitung ist, ist das Befehlszeilendesign besser geeignet, sodass Apple die Stapelerstellungsfunktion schrittweise aus Xcode entfernt hat. Ich erwarte daher nicht, dass sie in Zukunft UI-basierte Batch-Build-Funktionen anbieten.
quelle
Ich brauchte eine fette statische Bibliothek für JsonKit, also erstellte ich ein statisches lib-Projekt in Xcode und führte dann dieses Bash-Skript im Projektverzeichnis aus. Solange Sie das xcode-Projekt mit deaktivierter Option "Nur aktive Konfiguration erstellen" konfiguriert haben, sollten Sie alle Architekturen in einer Bibliothek erhalten.
quelle
IOS 10 Update:
Ich hatte ein Problem beim Erstellen der Fatlib mit iphoneos10.0, da der reguläre Ausdruck im Skript nur 9.x und niedriger erwartet und 0.0 für ios 10.0 zurückgibt
Um dies zu beheben, ersetzen Sie es einfach
mit
quelle
Ich habe daraus eine Xcode 4-Vorlage gemacht , genau wie Karls statische Framework-Vorlage.
Ich fand heraus, dass das Erstellen statischer Frameworks (anstelle von einfachen statischen Bibliotheken) aufgrund eines offensichtlichen Linker-Fehlers zufällige Abstürze mit LLVM verursachte - ich denke also, statische Bibliotheken sind immer noch nützlich!
quelle
Gut gemacht! Ich habe etwas Ähnliches zusammen gehackt, musste es aber separat ausführen. Wenn es nur Teil des Erstellungsprozesses ist, wird es so viel einfacher.
Ein Hinweis. Mir ist aufgefallen, dass keine der Include-Dateien kopiert wird, die Sie als öffentlich markieren. Ich habe das, was ich in meinem Skript hatte, an Ihr Skript angepasst und es funktioniert ziemlich gut. Fügen Sie Folgendes am Ende Ihres Skripts ein.
quelle
Ich habe gerade mein eigenes Skript geschrieben für diesen Zweck geschrieben. Es wird kein Xcode verwendet. (Es basiert auf einem ähnlichen Skript im Gambit-Schema-Projekt.)
Grundsätzlich wird ./configure ausgeführt und dreimal erstellt (für i386, armv7 und armv7s) und jede der resultierenden Bibliotheken zu einer fetten Bibliothek kombiniert.
quelle