iphone html5 - Was macht das-all_load-Linker-Flag?




example definition (2)

Dies hängt wahrscheinlich mit dieser technischen Anmerkung zusammen: https://developer.apple.com/library/content/qa/qa1490/_index.html

WICHTIG: Bei 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 sichtbaren Archiv zu laden, auch wenn diese keinen Objective-C-Code haben. -force_load ist in Xcode 3.2 und höher verfügbar. Es ermöglicht eine feinere Steuerung des Archivladens. Auf jede Option -force_load muss ein Pfad zu einem Archiv folgen, und jede Objektdatei in diesem Archiv wird geladen.

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

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

Kann mir jemand dabei helfen?

Vielen Dank


In den alten Tagen (pre-ANSI) war das vax Symbolen wie unix und vax eine Möglichkeit, Code zur Kompilierungszeit erkennen zu lassen, für welches System er kompiliert wurde. Es gab damals keinen offiziellen Sprachstandard (jenseits des Referenzmaterials auf der Rückseite der ersten Ausgabe von K & R), und C-Code jeder Komplexität war typischerweise ein komplexes Labyrinth von #ifdef , um Unterschiede zwischen Systemen zu #ifdef . Diese Makrodefinitionen wurden im Allgemeinen vom Compiler selbst festgelegt und nicht in einer Bibliothekskopfdatei definiert. Da es keine echten Regeln gab, welche Kennungen von der Implementierung verwendet werden könnten und welche für Programmierer reserviert waren, fühlten sich Compiler-Autoren frei, einfache Namen wie unix und nahmen an, dass Programmierer diese Namen einfach für ihre eigenen Zwecke verwenden würden.

Der 1989 ANSI C-Standard führte Regeln ein, die einschränkten, welche Symbole eine Implementierung rechtlich vorgeben könnte. Ein vom Compiler vordefiniertes Makro kann nur einen Namen haben, der mit zwei Unterstrichen oder einem Unterstrich gefolgt von einem Großbuchstaben beginnt. Programmierer können dann Bezeichner verwenden, die nicht mit diesem Muster übereinstimmen und nicht in der Standardbibliothek verwendet werden.

Als Ergebnis ist jeder Compiler, der unix oder linux vordefiniert, nicht konform, da es nicht kompilieren wird, um den richtigen Code zu kompilieren, der etwas wie int linux = 5; .

Wie dem auch sei, gcc ist standardmäßig nicht konform - aber es kann so gemacht werden, dass es (recht gut) mit den richtigen Kommandozeilenoptionen übereinstimmt:

gcc -std=c90 -pedantic ... # or -std=c89 or -ansi
gcc -std=c99 -pedantic
gcc -std=c11 -pedantic

Weitere Informationen finden Sie im gcc-Handbuch .

gcc wird diese Definitionen in zukünftigen Versionen auslaufen lassen, also sollten Sie keinen Code schreiben, der von ihnen abhängt. Wenn Ihr Programm wissen muss, ob es für ein Linux-Ziel kompiliert wird oder nicht, kann es prüfen, ob __linux__ definiert ist (vorausgesetzt, Sie verwenden gcc oder einen Compiler, der damit kompatibel ist). Weitere Informationen finden Sie im GNU C-Präprozessorhandbuch .

Eine weitgehend irrelevante Nebenbemerkung: Der "Best One Liner" -Gewinner des International Obfuscated C Code Contest 1987 von David Korn (ja, der Autor der Korn Shell) nutzte das vordefinierte unix Makro:

main() { printf(&unix["\021%six\012\0"],(unix)["have"]+"fun"-0x60);}

Es druckt "unix" , aber aus Gründen, die absolut nichts mit der Schreibweise des Makronamens zu tun haben.





iphone objective-c gcc linker