web-dev-qa-db-de.com

iOS Bibliothek zu BitCode

Ich habe kürzlich die Beta-Version von Xcode 7 heruntergeladen und Xcode beklagt sich darüber, dass einige meiner C-Bibliotheken nicht in BitCode kompiliert wurden. Wie würde ich Clang anweisen, BitCode zu produzieren, der mit iOS kompatibel ist? Ich habe ähnliche Antworten zum Stackoverflow gesehen, weiß aber nicht, ob sie sich auf die Erstellung von BitCode-Bibliotheken für iOS beziehen.

Bearbeiten:

Ich verwende die richtige Einstellung, -fembed-bitcode, aber wenn ich versuche zu archivieren, erhalte ich die Fehlermeldung: ld: warning: Ignoriere Datei XXXX/XXXX, Datei wurde für das Archiv erstellt, das nicht die Architektur ist, die verknüpft wird (arm64). Wenn ich -fembed-bitcode-marker verwende, kann ich archivieren, aber ich erhalte die Fehlermeldung: Das vollständige Bitcode-Bundle konnte nicht generiert werden, da XX/XX nur mit Bitcode-Marker erstellt wurde. Die Bibliothek muss aus einem Xcode-Archiv mit aktiviertem Bitcode generiert werden.

Irgendwelche Ideen, was schief läuft? Die Bibliothek wird erfolgreich kompiliert, aber ich kann sie nicht archivieren. Ich habe eine einfache Add-Funktion erstellt und in eine Bibliothek umgewandelt, und es treten die gleichen Symptome auf, sodass ich nicht die Bibliothek kompiliere.

Bearbeiten 2: Sie müssen sowohl die arm64- als auch die armv7-Version unter Verwendung von Bitcode und Lipo zusammen erstellen. Die Verwendung von Bitcode macht eine umfangreiche Bibliothek für die Archivierung nicht überflüssig. Quelle: https://forums.developer.Apple.com/message/25132#25132

47
stack_tom

Wenn Sie statische Bibliotheken erstellen, müssen Sie Folgendes für die Bitcode-Generierung hinzufügen:

-fembed-bitcode 

für eine dynamische Bibliothek müssen Sie zusätzlich mit verknüpfen

-fembed-bitcode

Hinweis: Dieser Befehl ist nur mit Xcode7 + verfügbar

In Bezug auf die akzeptierte Antwort der Verwendung von -fembed-bitcode-marker

Beachten Sie, dass ein normaler Build mit der Option -fembed-bitcode-marker eingebettete Bitcode-Abschnitte mit minimaler Größe ohne echten Inhalt erzeugt. Auf diese Weise können Sie die Bitcode-bezogenen Aspekte Ihres Builds testen, ohne den Build-Prozess zu verlangsamen. Der tatsächliche Bitcode-Inhalt wird beim Erstellen eines Archivs berücksichtigt.

bwilson Apple Staff. https://forums.developer.Apple.com/thread/3971#12225


Um genauer zu sein:

  • -fembed-bitcode-marker markiert einfach, wo sich der Bitcode nach einem Archivaufbau in der Binärdatei befinden würde.
  • -fembed-bitcode erstellt und bettet tatsächlich den gesamten Bitcode. Daher müssen Sie diese zum Erstellen statischer Bibliotheken verwenden.
  • Xcode selbst baut mit -fembed-bitcode-marker für reguläre Builds (wie im Simulator implementieren)
  • Xcode baut nur mit -fembed-bitcode für Archivbuilds/Produktionsbuilds (da dies nur für Apple benötigt wird).
62
Danoli3

Gehen Sie zu den Build-Einstellungen . Suchen Sie nach " benutzerdefinierten Compiler-Flags ".
Hinzufügen -fembed-bitcode bis Andere C-Flags . Dadurch wird sichergestellt, dass die Bibliothek bei der Kompilierung mit Bitcode kompatibel ist. Ich habe dies für iOS 64-Bit und 32-Bit gemacht und sie zu einer zusammengefasst. Klappt wunderbar.

Da ihr Fragen hattet, ist hier ein Screenshot der Einstellungen: Die Einstellungen sind für das Projektziel und das SDK-Ziel gleich.

enter image description here


Die Bitcode-Bibliothek funktioniert nicht mit Xcode 6.

50
Gautam Jain

Wenn Sie nach dem Hinzufügen von -fembed-bitcode Zu den anderen C-Flags weiterhin Probleme haben, suchen Sie unter "Build-Optionen" nach "Bitcode aktivieren" und setzen Sie es auf "Nein". Auf diese Weise können Sie ordnungsgemäß archivieren.

26
Ian Han

Was Sie brauchen, ist -fembed-Bitcode. Wenn ENABLE_BITCODE aktiviert ist, erstellt Xcode mit -fembed-bitcode-marker für reguläre Builds und mit -fembed-bitcode für Archivbuilds. Eine Option "markiert" einfach, wo sich der Bitcode nach einem Archivbuild in der Binärdatei befinden würde und erzwingt die neuen Bitcode-Regeln, während die andere tatsächlich die vollständige Bitcode-Generierung ausführt, die wahrscheinlich langsamer ist und daher nicht bei jeder Art von Build aktiviert wird .

Syo Ikedas Leitfaden zum Umgang mit BITCODE kann Ihnen auch helfen:

Das vollständige Dia-Deck finden Sie hier.

15
Xeieshan

Wenn Sie eine statische Bibliothek erstellen und den Bitcode aktivieren möchten, reicht möglicherweise nur (1) ENABLE_BITCODE = YES nicht aus.

(2) Auch mit der Einstellung -fembed-bitcode Der folgende Fehler wurde beim Erstellen in Teamcity immer noch für mehrere Dateien ausgegeben

bitcode bundle could not be generated because ‘/path/fileInYourStaticLib.a(fileInYourStaticLib.o)’ was built without full bitcode. All object files and libraries for bitcode must be generated from Xcode Archive or Install build for architecture arm64

Zusätzlich zu den obigen Schritten (1) und (2) gab es ein paar Tipps/Überlegungen, die mir geholfen haben, das Problem endgültig zu lösen.

  1. Stellen Sie sicher, dass Sie die Variable 'Other C Flags' auf '-fembed-bitcode' im 'PROJECT' und in allen 'TARGETS' setzen.

  2. Wenn es mehrere Projekte gibt, für die Sie eine statische Bibliothek erstellen möchten, stellen Sie sicher, dass alle Projekte "-fembed-bitcode" aktiviert.

  3. On Build Settings, click on the + sign at the top to add a user-defined build setting with the nameBITCODE_GENERATION_MODE, and set Debug toMarker, Release tobitcode

  4. Wenn die obigen Schritte nicht funktionieren, können Sie diese Option auch ausprobieren. On Build Settings -> Other C flags, set Debug to- fembed-bitcode-marker, and Release to- Fembed-Bitcode

Dieser Blog hat mir sehr geholfen https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

Versuchen Sie außerdem jedes Mal, wenn Sie die obigen Änderungen vornehmen, die abgeleiteten Daten zu löschen, das XCode-Projekt zu bereinigen und möglicherweise XCode zu beenden und neu zu starten

10
Naishta