Wie erstelle ich eine statische Bibliothek mit aktiviertem Bitcode?

88

Xcode 7 führt Bitcode ein , eine Art LLVM-Zwischenbinärdatei, mit der Apples Server meine App ohne mein Zutun für verschiedene Architekturen neu kompilieren können.

Bei Lookback verteile ich ein statisches Archivframework mit unserer Bibliothek. Es scheint, dass beim Erstellen mit etwas anderem als "Build & Archive" kein Bitcode in meine Bibliothek ausgegeben wird und jeder, der in seiner App eine Verknüpfung zu meiner Bibliothek herstellt und versucht, ein Build & Archive mit aktiviertem Bitcode durchzuführen, einen davon erhält zwei Warnungen:

  • ld: 'Lookback(Lookback.o)' does not contain bitcode. You must rebuild it with bitcode enabled (Xcode setting ENABLE_BITCODE), obtain an updated library from the vendor, or disable bitcode for this target. (wenn lib mit Xcode 6 erstellt wurde)
  • ld: warning: full bitcode bundle could not be generated because 'Lookback(Lookback.o)' was built only with bitcode marker. The library must be generated from Xcode archive build with bitcode enabled (Xcode setting ENABLE_BITCODE) (wenn lib mit Xcode 7 mit einem normalen xcodebuild erstellt wurde)

Ich habe ein Build-Skript, das eine universelle Binärdatei für Gerät + Simulator erstellt, daher kann ich Build & Archive nicht verwenden, sondern über die xcodebuildBefehlszeile meines Skripts ausführen . Wie kann ich xcodebuildeine richtige bitcode-fähige Bibliothek generieren lassen?

Nevyn
quelle
HI @nevyn Ich versuche, Ihr SDK in einer App zu kompilieren, die Bitcode verwendet. Gibt es einen Weg?
Stoff81
@ Stoff81 Sorry, ich arbeite daran. Ich muss zuerst alle meine Abhängigkeiten mit Bitcode arbeiten lassen, und es ist ziemlich viel Arbeit.
Nevyn

Antworten:

134

Bitcode ist eine Funktion zur Kompilierungszeit (keine Funktion zur Verbindungszeit). Dies bedeutet, dass jede .o-Datei einen zusätzlichen Abschnitt namens __bitcode enthalten sollte, wenn sie mit Bitcode erstellt wird. Sie können überprüfen, ob Ihre Binärdatei Bitcode-kompatibel ist, indem Sie ausführen otool -l (my .o or .a file) | grep __LLVM.

Wenn Sie normal erstellen, fügt Xcode -fembed-bitcode-markerjedem Clang-Aufruf das Build-Flag hinzu . Dies scheint eine Art "Hier würde Bitcode hingehen, wenn Bitcode aktiviert wäre" zu sein, und Bitcode wird tatsächlich nicht aktiviert.

Wenn Sie "Build & Archive" verwenden, wird dieses Flag durch ersetzt -fembed-bitcode, wodurch tatsächlich eine Bitcode-fähige Binärdatei erstellt wird.

Es scheint zwei Möglichkeiten, um zu xcodebuildverwenden -fembed-bitcode:

  • Verwenden Sie die Aktion 'Archivieren' wie in xcodebuild -target LookbackSDK archiveanstelle von xcodebuild -target LookbackSDK build. Dies hat den Nebeneffekt, dass Binärdateien in Ihren Xcode Organizer anstelle des build/Ordners eingefügt werden. Sie können dies jedoch mithilfe von -exportArchive -archivePath ./build(danke @JensAyton ) umgehen.
  • Erzwingen Sie die Verwendung des Flags, indem Sie Andere C-Flags mit hinzufügen OTHER_CFLAGS="-fembed-bitcode". Ihre xcodebuildAnrufung würde ungefähr so ​​aussehen xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Letzteres habe ich gewählt, damit ich mein Build-System nicht ändern muss, aber es werden Warnungen für jede Datei generiert, da jetzt beide -fembed-bitcode-markerund -fembed-bitcodean clang gesendet werden. Glücklicherweise gewinnt letzterer und generiert eine Bitcode-fähige Bibliothek!

Ressourcen

Nevyn
quelle
9
FWIW, Sie können die Warnung vor -fembed-bitcode-markerdem Ignorieren auch durch Hinzufügen entfernen -Qunused-arguments.
Mstorsjo
Welches exportFormat wird für einen xcodebuild eines Frameworks verwendet? Es scheinen nur "ipa", "pkg" und "app" definiert zu sein ( developer.apple.com/library/mac/documentation/Darwin/Reference/… ).
Fabian Köbel
@nevyn Meine Haupt-App mit der benutzerdefinierten Framework-Datei, die wiederum ein Build-Skript mit dem oben genannten Flag enthält, konnte immer noch nicht erstellt werden.
Ravoorinandan
otool -l (meine .o oder .a Datei). Meinen Sie otool -l (meine .o oder .a Datei) | grep __bitcode?
Mike M
1
@MikeM nein eigentlich otool -l myfile.o | grep __LLVM, denn es wird ein __bitcode-Segment geben, auch wenn dort nur Bitcode-Marker anstelle von echtem Bitcode vorhanden sind.
Nevyn
39

Mit Xcode 8 konnte ich nicht OTHER_CFLAGS="-fembed-bitcode"arbeiten. Ich bin immer wieder auf etwas gestoßen, wie was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install buildich es versucht habe, einen Archiv-Build einer App zu erstellen, die mein statisches Framework enthält.

Was ich wirklich suchte, war Folgendes:

BITCODE_GENERATION_MODE=bitcode

Ich verwende tatsächlich ein Run-Skript innerhalb eines aggregierten Ziels. Die vollständige xcodebuild-Zeile sieht folgendermaßen aus (nur als Referenz):

xcodebuild BITCODE_GENERATION_MODE=bitcode OTHER_CFLAGS="-fembed-bitcode" -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

Aaron Ash
quelle
2
+1 BITCODE_GENERATION_MODE=bitcodescheint die Methode bevorzugt zu sein, wie auch in dieser Antwort vorgeschlagen .
William Denniss
Dies hat auch mein Problem behoben, während die Standardantwort nicht mehr funktioniert.
Kamtschatka
Lebensretter! Danke dir!
Vidalbenjoe
17

Sobald Sie die Bitcode-Unterstützung für die statische Bibliothek hinzugefügt haben, ist diese nicht mehr mit Xcode 6 kompatibel. Die App wird nicht archiviert.

Ich möchte die Einstellung für Bitcode klar erwähnen, da mich die Antwort von @ nevyn ein wenig verwirrt hat.

Gehen Sie zu Build-Einstellungen und suchen Sie nach "benutzerdefinierten Compiler-Flags". Hinzufügen -fembed-bitcode. Dadurch wird Ihre Bibliothek mit Bitcode erstellt.

Gautam Jain
quelle
6

Wählen Sie unter Build-Einstellungen -> Andere C-Flags das Projekt aus. Setzen Sie Debug auf -fembed-Bitcode-Marker und Release auf -fembed-Bitcode

Klicken Sie in den Build-Einstellungen oben auf das Pluszeichen +, um eine benutzerdefinierte Build-Einstellung mit dem Namen BITCODE_GENERATION_MODE hinzuzufügen, und setzen Sie Debug auf die Markierung Release to Bitcode

Schema als Release bearbeiten Klicken Sie dann auf die gewünschte Bibliothek. Eine Datei und erhalten Sie den Erstellungspfad. Rufen Sie den Bibliotheksformular-Freigabeordner ab.

Oshitha Wimalasuriya
quelle