15

Ich weiß, dass diese Frage mehrmals gestellt wurde, aber mein Ziel ist etwas anders in Bezug auf das, was ich im Internet gefunden habe. Insbesondere kann ich bereits eine statische Bibliothek für das iPhone erstellen, aber die finale Fettdatei, die ich erstellen kann, enthält nur Arm- und i386-Architekturen (und ich bin mir nicht sicher, welcher Arm sich bezieht: ist v6 oder v7?). Ich bin nicht in der Lage, speziell für Armv6 und Armv7 kompilieren und sie beide Architekturen mit Lipo zusammenführen. Das Lipo-Tool beschwert sich, dass die gleiche Architektur (Arm, nicht Armv6 oder Armv7) in den Armv6- und Armv7-Bibliotheken vorhanden ist.Wie kompiliere ich eine statische Bibliothek (Fett) für armv6, armv7 und i386

Kann jemand genau erklären, wie man für armv6 und armv7 baut, und sie diese Bibliotheken in eine fette Datei mit lipo zusammenführen?

BEARBEITEN: Ich muss nicht mit Xcode erstellen, sondern kompilieren direkt eine traditionelle Unix-Bibliothek.

Antwort

7

Gerade libtool verwenden die beiden ARM6 und arm7 Versionen miteinander zu verknüpfen - das, was XCode tut. Sie werden jedoch Probleme haben, wenn Sie versuchen, diese statischen Bibliotheken zu einer neuen Superbibliothek zu kombinieren. Wenn Sie das tun müssen, lesen Sie this.

Wenn Sie dies bereits tun, würde sich lipo beschweren, dass Ihre "armv6" -Bibliothek sowohl Armv6 als auch Armv7 enthält. Mein Post hat einen Fix, der wahrscheinlich einfacher für Sie ist, da Sie nicht XCode verwenden, aber im Grunde verwenden Sie Lipo-Extract, um sicherzustellen, dass Sie eine dünne Armv6-Bibliothek und eine dünne Armv7-Bibliothek haben, bevor Sie weiter gehen.

2

Stellen Sie sicher, dass die Build-Einstellungen auf Valid Architectures: armv6 armv7 und Architectures: Optimized (armv6 armv7) eingestellt sind. Dies sollte zu einer binären Optimierung für beide v6 & v7 führen. Wenn Sie nicht sicher sind, ob es funktioniert hat, setzen Sie einfach Architectures: Standard (armv6) und vergleichen Sie die Dateigrößen. Optimiert sollte doppelt so groß sein (wenn ich mich richtig erinnere).

Sie können auch immer lipo -info auf Ihrer Binärdatei verwenden, um alle enthaltenen Architekturen zu sehen.

es auf einer Verteilung Build von meinem app Laufen gibt mir:

ullrich ~/Code/.../build/Distribution-iphoneos/My.app (streaming)$ lipo -info My 
Architectures in the fat file: My are: armv6 armv7 
+0

Entschuldigung, ich habe vergessen zu erwähnen, dass ich dies nicht mit Xcode erstellen, sondern direkt eine traditionelle Unix-Bibliothek kompilieren muss. Ich bearbeite meine Antwort, um diese Tatsache widerzuspiegeln. –

2

Es scheint nicht notwendig zu sein, aus der Fett-Bibliothek zu extrahieren, bevor man sich wieder anmeldet (wie in Jamies Antwort beschrieben). Ich benutze das finale 4.0 SDK von Apple, das die fetten armv6/armv7-Bibliotheken standardmäßig zu erstellen scheint.

ich zuvor wurde die Architektur für die Eingabe lib wie so festgelegt wird:

$DEVROOT/usr/bin/lipo -arch arm $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Dies schlägt auf den späteren SDKs, aber die Architektur von der (jetzt Fett) Entfernen Arm lib funktioniert:

$DEVROOT/usr/bin/lipo $PROJECT_DIR/buildlib/Release-iphoneos/lib.a -arch i386 $PROJECT_DIR/buildlib/Release-iphonesimulator/lib.a -create -output $PROJECT_DIR/buildlib/lib.a 

Lipo muss jetzt in der Lage sein, die Architekturen in den Fettbibliotheken zu erkennen.

10

Hier ist eine gute Lösung, die ich gefunden: Static Libs With Support to iOS 5 and Arm64

Edited:

Die Lösung wird dann binden sie getrennt unterschiedliche Architekturen bauen Lipo Verwendung von Befehlszeile (oder Rakefile).

Zunächst baut die Binärdatei mit Arm mit xcodebuild:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='armv7 armv7s' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-arm' BUILT_PRODUCTS_DIR='./build-arm' 

Beachten Sie, dass IPHONEOS_DEPLOYMENT_TARGET = ‚5.0‘ und ARCHS = ‚ARMv7 armv7s‘ gesetzt sind, wird empfohlen, dirs zu bauen und ein Produkt zu setzen, um die Dinge zu machen Sehen Sie sich Build Setting Reference genauer an, was diese Flags bedeuten.

nächste Build für arm64:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphoneos7.0' clean build ARCHS='arm64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-arm64' BUILT_PRODUCTS_DIR='./build-arm64' 

Beachten Sie den Unterschied auf ARCHS und IPHONEOS_DEPLOYMENT_TARGET. Wir brauchen auch für Simulator zu bauen, in diesem Fall müssen wir die sdk ändern in zwei Schritten zunächst für i386 iphonesimulator7.0 und bauen:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='i386' IPHONEOS_DEPLOYMENT_TARGET='5.0' TARGET_BUILD_DIR='./build-i386' BUILT_PRODUCTS_DIR='./build-i386' 

Jetzt kommt der schwierige Teil! Wenn Sie je nach Xcode-Einstellung einfach den ARCHS in x86_86 ändern, erhalten Sie einen Fehler wie: "x86_64 ist kein gültiger Arch". Um dies zu vermeiden nur VALID_ARCHS = ‚x86_64‘ hinzufügen:

xcodebuild -project 'StaticLibDemo.xcodeproj' -configuration 'Release' -sdk 'iphonesimulator7.0' clean build ARCHS='x86_64' VALID_ARCHS='x86_64' IPHONEOS_DEPLOYMENT_TARGET='7.0' TARGET_BUILD_DIR='./build-x86_64' BUILT_PRODUCTS_DIR='./build-x86_64' 

Schließlich müssen wir schaffen nur einen fetten binär mit allen 5-Architekturen:

lipo -create './build-arm/libStaticLibDemo.a' './build-arm64/libStaticLibDemo.a' './build-i386/libStaticLibDemo.a' './build-x86_64/libStaticLibDemo.a' -output 'libStaticLibDemo.a' 

Der Autor ein funktionierendes Beispiel dafür geschaffen, Sie es bekommen kann: Static Libs With Support to iOS 5 and Arm64

: https://github.com/diogot/StaticLibDemo


Hier ist der Link zum Beitrag ist

Alle Credits gehen an Diogo Tridapalli.

+0

Danke, dass du es mir erzählt hast! @kleopatra – Yang

+0

Danke für die Kredite @ yang! –

Verwandte Themen