Was macht das Linker-Flag -all_load?

123

Ich kann nirgendwo finden, was das Flag -all_load beim Kompilieren von Objective-C-Code bewirkt.

Ich habe einige Probleme beim Hochladen von Binärdateien auf Apple. Sie sagen, das liegt daran, dass ich dieses Flag nicht verwendet habe, aber mein Code wird auch ohne es kompiliert.

Kann mir jemand dabei helfen?

Vielen Dank

Guy Ephraim
quelle
2
In der Regel treten beim Ausführen der Anwendung auf dem Gerät auftretende Fehler auf. Wollen Sie damit sagen, dass Sie Ihre Anwendung nicht auf der tatsächlichen Hardware getestet haben, bevor Sie sie zur Überprüfung durch Apple eingereicht haben? Wenn ja, ist das eine sehr, sehr schlechte Idee.
Brad Larson
Ich habe es getestet, aber meine "Verteilungs" -Konfiguration - die mit dem App Store-Bereitstellungsprofil - hatte nicht das Flag und alle Tests wurden mit dem Entwicklungsprofil durchgeführt, das das Flag hatte, sodass alles in Ordnung zu sein scheint und wann Ich habe es für den App Store mit dem Verteilungsprofil kompiliert, bei dem das Flag deaktiviert war, und da das Verteilungsprofil nicht lokal installiert werden kann, konnte ich es nicht überprüfen.
Guy Ephraim

Antworten:

144

Es hängt wahrscheinlich mit diesem technischen Hinweis https://developer.apple.com/library/content/qa/qa1490/_index.html zusammen

WICHTIG: Für 64-Bit- und iPhone-Betriebssystemanwendungen gibt es einen Linker-Fehler, der verhindert, dass -ObjC Objektdateien aus statischen Bibliotheken lädt, die nur Kategorien und keine Klassen enthalten. Die Problemumgehung besteht darin, die Flags -all_load oder -force_load zu verwenden. -all_load zwingt den Linker, alle Objektdateien aus jedem Archiv zu laden, auch solche ohne Objective-C-Code. -force_load ist in Xcode 3.2 und höher verfügbar. Es ermöglicht eine feinere Kornkontrolle der Archivladung. Auf jede Option -force_load muss ein Pfad zu einem Archiv folgen, und jede Objektdatei in diesem Archiv wird geladen.

Sharjeel Aziz
quelle
3
Ja, dies kommt hauptsächlich bei statischen Bibliotheken für das iPhone zum Tragen. Wenn sie ohne dieses Linker-Flag kompiliert werden, sind die Kategorien nicht in der erstellten Binärdatei enthalten, und jede Anwendung, die diese statischen Bibliotheken verwendet, weist Laufzeitfehler auf, wenn sie auf iPhone OS-Hardware ausgeführt wird.
Brad Larson
1
Sollte es beim Kompilieren keine Warnungen oder Fehler der fehlenden Methode geben?
Guy Ephraim
18
Nein, da die Kategorien zur Kompilierungszeit vorhanden sind, werden sie einfach nicht mit der endgültigen Binärdatei verknüpft. Aufgrund der Dynamik von Obj-C-Versendungen verweist der Linker den Aufruf von Code nicht direkt auf die Implementierungsmethode, sodass er nie bemerkt, dass er fehlt. Dann erhalten Sie zur Laufzeit den Kaboom, so als hätten Sie ihn mit "-performSelector:"
Sophistifunk
14
Ich möchte nur den technischen Hinweis klarstellen: Meistens möchten Sie das Linker-Flag -ObjC, nicht -all_load. -all_load wird in der (ich würde selten annehmen) Instanz empfohlen, in der Sie eine Bibliothek ohne Klassen, nur Kategorien haben.
Chris Hill
3
Laut stackoverflow.com/a/2615407/62 wurde dies ab XCode 4.2 behoben, sodass Sie die Flags -all_load oder -force_load nicht mehr benötigen. Du brauchst noch -ObjC.
Liron Yahdav