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 xcodebuild
Befehlszeile meines Skripts ausführen . Wie kann ich xcodebuild
eine richtige bitcode-fähige Bibliothek generieren lassen?
Antworten:
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-marker
jedem 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
xcodebuild
verwenden-fembed-bitcode
:xcodebuild -target LookbackSDK archive
anstelle vonxcodebuild -target LookbackSDK build
. Dies hat den Nebeneffekt, dass Binärdateien in Ihren Xcode Organizer anstelle desbuild/
Ordners eingefügt werden. Sie können dies jedoch mithilfe von-exportArchive -archivePath ./build
(danke @JensAyton ) umgehen.OTHER_CFLAGS="-fembed-bitcode"
. Ihrexcodebuild
Anrufung würde ungefähr so aussehenxcodebuild 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-marker
und-fembed-bitcode
an clang gesendet werden. Glücklicherweise gewinnt letzterer und generiert eine Bitcode-fähige Bibliothek!Ressourcen
quelle
-fembed-bitcode-marker
dem Ignorieren auch durch Hinzufügen entfernen-Qunused-arguments
.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.Mit Xcode 8 konnte ich nicht
OTHER_CFLAGS="-fembed-bitcode"
arbeiten. Ich bin immer wieder auf etwas gestoßen, wiewas built without full bitcode. All frameworks and dylibs for bitcode must be generated from Xcode Archive or Install build
ich es versucht habe, einen Archiv-Build einer App zu erstellen, die mein statisches Framework enthält.Was ich wirklich suchte, war Folgendes:
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
quelle
BITCODE_GENERATION_MODE=bitcode
scheint die Methode bevorzugt zu sein, wie auch in dieser Antwort vorgeschlagen .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.quelle
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.
quelle