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?
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:
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 )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!
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
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.
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