iOS-Bibliothek in BitCode

Lesezeit: 8 Minuten

Benutzeravatar von stack_tom
stack_tom

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

Bearbeiten:

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

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

Bearbeiten 2: Sie müssen sowohl die arm64- als auch die armv7-Version mit Bitcode erstellen und sie zusammen lipo. Die Verwendung von Bitcode beseitigt nicht die Notwendigkeit einer dicken Bibliothek bei der Archivierung. Quelle : Verknüpfung

  • Sie kompilieren diese C-Bibliotheken also selbst?

    – Benutzer102008

    5. Juli 2015 um 21:26 Uhr

  • Ja, speziell nach gmp fragen. Aber ich frage im Allgemeinen, wie wir Clang bekommen, um BitCode zu produzieren, der mit iOS funktioniert. Ich weiß, dass es eine Option gibt, um Clang dazu zu bringen, bei der Zwischendarstellung (IR) anzuhalten, aber ich weiß nicht, ob dies mit dem gesamten BitCode funktioniert, den Apple jetzt erwähnt.

    – stack_tom

    6. Juli 2015 um 4:07 Uhr

Benutzeravatar von Danoli3
Danoli3

Beim Erstellen statischer Bibliotheken 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 von using -fembed-bitcode-marker

Sie sollten sich darüber im Klaren sein, dass ein normaler Build mit der Option -fembed-bitcode-marker eingebettete Bitcode-Abschnitte minimaler Größe ohne echten Inhalt erzeugt. Dies geschieht, um die bitcodebezogenen Aspekte Ihres Builds zu testen, ohne den Build-Prozess zu verlangsamen. Der eigentliche Bitcode-Inhalt ist enthalten, wenn Sie ein Archiv erstellen.

bwilson Apple Mitarbeiter.
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 führt tatsächlich die vollständige Bitcode-Generierung und -Einbettung aus, also müssen Sie dies zum Erstellen statischer Bibliotheken verwenden.
  • Xcode selbst baut mit -fembed-bitcode-marker für reguläre Builds (wie die Bereitstellung im Simulator)
  • Xcode baut nur mit -fembed-bitcode für Archiv-Builds / Produktions-Builds (da dies nur für Apple benötigt wird).

  • Danke für den Xcode-Select-Build-Trick, das ist sehr nützlich, und ich wusste nichts davon. Wenn ich also -fembed-bitcode verwende, funktionieren die produzierten Bibliotheken unter dem Simulator? Ich muss derzeit die -fembed-bitcode-marker-Bibliotheken verwenden, wenn ich sie auf dem Gerät bereitstelle, aber ich muss meine zuvor kompilierten Fat-Bibliotheken verwenden, wenn ich auf dem Simulator laufe, sonst bekomme ich Linker-Fehler. Wenn ich -fembed-bitcode-marker verwende, erstellt Xcode die Bitcode-Versionen der Bibliothek bei der Bereitstellung auf dem Gerät, da ich keine Warnungen mehr erhalte?

    – stack_tom

    10. Juli 2015 um 22:08 Uhr


  • Okay, ich habe mit diesem Befehl gebaut. Ich habe jedoch die gleichen Symptome wie zuvor – die Fat-Bibliotheken laufen auf dem Simulator, die -fembed-Bitcode-Bibliotheken jedoch nicht. Außerdem kann ich nicht archivieren. Xcode sagt: „ld: warning: Ignoring file X, file was built for archive that is not the architecture that is linked (arm64).“ Wenn ich die -fembed-bitcode-marker-Bibliothek verwende, kann ich archivieren, aber ich erhalte erneut die Bitcode-Warnungen, wie Sie sagten (da es sich nicht wirklich um Bitcode handelt). Warum kann ich nicht nur dann mit -fembed-bitcode archivieren, es sagt sogar, dass es für die Archivierung gebaut wurde.

    – stack_tom

    10. Juli 2015 um 22:44 Uhr

  • Ich habe das gleiche Problem und ich habe das gleiche versucht :/

    – Prateek

    10. Oktober 2015 um 19:31 Uhr

  • Wo ich diese Zeile einfügen muss, sagen Sie mir bitte

    – Mahesh Narla

    24. Februar 2017 um 7:32 Uhr

Benutzeravatar von Gautam Jain
Gautam Jain

Gehen Sie die Build-Einstellungen. Suchen nach “benutzerdefinierte Compiler-Flags“.

Hinzufügen -fembed-bitcode zu Andere C-Flags. Dadurch wird sichergestellt, dass die Bibliothek zur Kompilierzeit mit Bitcode-Kompatibilität erstellt wird. Ich habe dies für iOS 64 Bit und 32 Bit gemacht und sie in eins gepackt. Klappt wunderbar.

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

Geben Sie hier die Bildbeschreibung ein


Die Bitcode-Bibliothek funktioniert nicht mit Xcode 6.

  • Können Sie bitte das Skript für die Erstellung von 64-Bit, 32-Bit und für den Simulator teilen und sie dann zu einem zusammenfassen?

    – Satyam

    8. Oktober 2015 um 14:38 Uhr

  • lipo -create -output “Ziel” “Quelle1” “Quelle2” “Quelle 3”. Hier ist Quelle 1 Ihr Pfad zur 32-Bit-Simulatorbibliothek, „Quelle 2“ ist der Pfad zur 64-Bit-Simulatorbibliothek und „Quelle 3“ ist der Pfad zur „iOS-Gerätebibliothek“. Dies geschieht vom Terminal aus. Sie können die endgültigen Bibliotheksdetails mit diesem Befehl überprüfen lipo -info “path to the final lib”

    – Gautam Jain

    8. Oktober 2015 um 15:06 Uhr


  • Danke, ich möchte den Build-Befehl zum Erstellen von 32-Bit- und 64-Bit-Lib-Dateien

    – Satyam

    8. Oktober 2015 um 15:27 Uhr

  • @GautamJain, ich verwende XCode7.0.1 und habe andere C-Flags mit -fembed-bitcode hinzugefügt, Bitcode=YES unter den Ziel-Build-Einstellungen aktiviert und dann den Lipo-Befehl auf den Geräte- und Simulator-Builds ausgeführt. Außerdem verwende ich ein Shell-Skript, um die Geräte- und Simulator-Builds mit den Optionen ENABLE_BITCODE = YES und OTHER_CFLAGS = “-fembed-bitcode” zu erstellen. Allerdings scheine ich kein Glück mit der Fettbibliothek zu haben. Der Bitcode wird aus der Fat-Bibliothek entfernt und ich kann meine Anwendung nicht archivieren, wenn ich Enable Bitcode=YES unter den Build-Einstellungen des Anwendungsziels einstelle. Ich bin verwirrt, warum Lipo Bitcode-Flags entfernt?

    – Deepak Badiger

    13. Oktober 2015 um 14:10 Uhr

  • “Bitcode wird aus der Fettbibliothek entfernt” sehe ich auch. Ich versuche mich davon zu überzeugen, dass dies ein erwartetes Verhalten ist …

    – jlaunisch

    23. November 2015 um 20:00 Uhr

Wenn Sie nach dem Hinzufügen immer noch Probleme haben -fembed-bitcode zu den anderen C-Flags, suchen Sie unter „Build Options“ nach „Enable Bitcode“ und setzen Sie es auf No. Dadurch können Sie ordnungsgemäß archivieren.

  • Sie, mein Herr, sind ein Lebensretter! Vielen Dank!

    – Tash Pemhiwa

    1. März 2017 um 18:59 Uhr

  • Es sollte auf nein gesetzt werden? nicht Ja? stackoverflow.com/questions/34666247/…

    – Schulranzen

    7. Juli um 4:46


Benutzeravatar von Zeeshan
Zeeshan

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 Archiv-Builds. Eine Option “markiert” einfach, wo sich der Bitcode nach einem Archiv-Build in der Binärdatei befinden würde, und erzwingt die neuen Bitcode-Regeln, während die andere tatsächlich die vollständige Bitcode-Generierung durchführt, die wahrscheinlich langsamer und daher nicht bei jeder Art von Build aktiviert ist .

Syo Ikedas Leitfaden zum Umgang mit BITCODE könnte Ihnen auch helfen:

YDUKW

Das vollständige Slide-Deck finden Sie hier.

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 immer noch für mehrere Dateien ausgegeben, als er in Teamcity erstellt wurde

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

Einige Tipps/Dinge, die mir geholfen haben, das Problem letztendlich zu lösen, zusätzlich zu den obigen Schritten (1) und (2)

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

  2. Wenn es mehrere Projekte gibt, für die Sie versuchen, eine statische Bibliothek zu erstellen, stellen Sie sicher, dass alle Projekte eine haben "-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 auch diese Option ausprobieren. On Build Settings -> Other C flags, set Debug to-fembed-Bitcode-Marker, and Release to-fembed-bitcode

Dieser Blog war eine große Hilfe
https://medium.com/@heitorburger/static-libraries-frameworks-and-bitcode-6d8f784478a9

Versuchen Sie auch jedes Mal, wenn Sie die oben genannten Änderungen vornehmen, die DerivedData zu löschen, das XCode-Projekt zu bereinigen und möglicherweise XCode zu beenden und neu zu starten

  • cool, ja, es ist leider nicht so einfach wie das Setzen einer Flagge 🙂

    – Naishta

    11. Mai 2017 um 4:54 Uhr

Benutzeravatar von Adam B
Adam B

Nur um ein paar Details für zukünftige Noobs wie mich hinzuzufügen.

Ich bin auf dieses Problem mit libVivoxNative.a gestoßen, als ich von Unity auf iOS erstellt habe. Ich musste Bitcode an 4 verschiedenen Stellen deaktivieren:

Bildschirmfoto

Ursprünglich hatte ich es wohl nur für das Ziel-Unity-iPhone eingestellt, nicht für das Projekt oder das Tests/UnityFramework. Das Ändern der Einstellung für alle 4 hat den Trick getan.

  • cool, ja, es ist leider nicht so einfach wie das Setzen einer Flagge 🙂

    – Naishta

    11. Mai 2017 um 4:54 Uhr

1412460cookie-checkiOS-Bibliothek in BitCode

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy