web-dev-qa-db-de.com

Wie erstelle ich eine statische Bibliothek mit aktiviertem Bitcode?

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, wenn Sie mit etwas anderem als "Build & Archive" erstellen, der Bitcode tatsächlich nicht in meine Bibliothek ausgegeben wird. Jeder, der in seiner App eine Verknüpfung zu meiner Bibliothek herstellt und versucht, ein Build & Archive mit aktiviertem Bitcode zu erstellen, erhält einen von 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 Geräte- und Simulator-Binärdatei erstellt, daher kann ich Build & Archive nicht verwenden, sondern führe xcodebuild über die Befehlszeile meines Skripts aus. Wie kann ich xcodebuild veranlassen, eine richtige Bitcode-fähige Bibliothek zu generieren?

80
nevyn

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

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

Wenn Sie "Build & Archive" wählen, wird dieses Flag durch -fembed-bitcode Ersetzt, wodurch wirklich eine Bitcode-fähige Binärdatei erstellt wird.

Es scheint zwei Möglichkeiten zu geben, xcodebuild mit -fembed-bitcode Zu erzeugen:

  • Verwenden Sie die Aktion 'archive' wie in xcodebuild -target LookbackSDK archive Anstelle von xcodebuild -target LookbackSDK build. Dies hat den Nebeneffekt, dass Binärdateien in Ihrem Xcode Organizer anstelle des Ordners build/ Abgelegt werden, obwohl Sie dies mit -exportArchive -archivePath ./build Umgehen können (danke @ JensAyton )
  • Erzwingen Sie die Verwendung des Flags, indem Sie andere C-Flags mit OTHER_CFLAGS="-fembed-bitcode" Hinzufügen. Ihr xcodebuild Aufruf würde ungefähr so ​​aussehen wie xcodebuild OTHER_CFLAGS="-fembed-bitcode" -target LookbackSDK build.

Letzteres habe ich gewählt, damit ich mein Build-System nicht ändern muss, aber es generiert Warnungen für jede Datei, da jetzt sowohl -fembed-bitcode-marker Als auch -fembed-bitcode An clang gesendet werden. Zum Glück gewinnt letzterer und generiert eine Bitcode-fähige Bibliothek!

Ressourcen

126
nevyn

Mit Xcode 8 konnte ich OTHER_CFLAGS="-fembed-bitcode" Nicht zum Laufen bringen. Ich bin immer wieder auf etwas in der Art von was built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build Gestoßen, als ich versuchte, einen Archivbuild einer App zu erstellen, die mein statisches Framework enthält.

Was ich wirklich suchte, war das:

BITCODE_GENERATION_MODE=bitcode

Ich verwende tatsächlich ein Run Script 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

34
Aaron Ash

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 den Bitcode deutlich erwähnen, da die Antwort von @nevyn mich ein wenig verwirrt hat.

Gehen Sie zu Build settings und suchen Sie nach "custom compiler flags". Hinzufügen -fembed-bitcode. Dadurch wird Ihre Bibliothek mit Bitcode erstellt.

17
Gautam Jain

projekt auswählen In den Build-Einstellungen -> Andere C-Flags 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 marker und Release to bitcode

Schema als Release bearbeiten Dann lecken Sie die Datei library.a und rufen den Erstellungspfad ab. Rufen Sie das Bibliotheksformular Release-Ordner ab