Welche spezifischen Optionen müsste ich im "Release-Modus" mit vollständigen Optimierungen in GCC erstellen? Wenn es mehr als eine Option gibt, listet sie alle auf. Vielen Dank.Wie wird im Release-Modus mit Optimierungen in GCC gebaut?
Antwort
http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
Es gibt keine ‚one size fits all‘ - Sie benötigen, um Ihre Anwendung, Ihre Anforderungen und die Optimierungsflags zu bestimmen, die richtige Teilmenge für die Binärdatei zu verstehen.
Oder die Antwort, die Sie wollen: O3
-O2 auf allen Optimierungen drehen wird, dass derjenige zu sein, keinen Raum \ Geschwindigkeit Handel benötigen ab und neigt dazu, die ich am häufigsten gebraucht. -O3 bietet Platz für Geschwindigkeits-Trade-offs (wie Funktion inline). -Os macht O2 plus andere Dinge, um die Code-Größe zu reduzieren. Dies kann Dinge schneller machen als O3, indem die Cache-Nutzung verbessert wird. (Testen Sie, ob es für Sie funktioniert.) Beachten Sie, dass es eine große Anzahl von Optionen gibt, die keiner der O-Schalter berührt. Der Grund, warum sie weggelassen werden, ist, dass es oft davon abhängt, welche Art von Code Sie schreiben oder sehr architekturabhängig sind.
Beachten Sie, dass gcc keinen "release mode" und keinen "debug mode" wie MSVC hat. Der gesamte Code ist nur Code. Das Vorhandensein der verschiedenen Optimierungsoptionen (-O2 und -Os sind die einzigen, die Sie im Allgemeinen beachten müssen, es sei denn, Sie führen eine Feinabstimmung durch) ändert den generierten Code, jedoch nicht so, dass die Interoperabilität mit anderen ABI-kompatiblen Systemen verhindert wird Code. Im Allgemeinen möchten Sie Optimierung auf Sachen, die Sie freigeben möchten.
Das Vorhandensein der Option "-g" bewirkt, dass erweiterte Symbol- und Quellcodeinformationen in die generierten Dateien eingefügt werden, was beim Debuggen hilfreich ist, aber die Größe der Datei erhöht (und Ihren Quellcode preisgibt) ist etwas, das du oft nicht in "freigegebenen" Binärdateien willst.
Aber sie sind nicht exklusiv. Sie können eine Binärdatei mit Optimierungs- und Debug-Informationen kompilieren oder eine mit keiner.
Die Optimierung sollte normalerweise deaktiviert werden, wenn Sie beabsichtigen, den generierten Code zu debuggen, andernfalls werden Sie feststellen, dass das Debugging eine Erfahrung ist, die einem David Lynch-Film ähnelt. – caf
Es ist nicht so schlimm, ich schaue Stack-Dumps und valgrind Ausgabe von "Release" Binaries die ganze Zeit. Solange Sie nicht den -fomit-stack-pointer verwenden und verstehen, dass Statiken inline und unsichtbar sein können, können Sie sogar aus einer stark optimierten Binärdatei eine Menge Kontexte lesen. Wenn Ihre Funktionen kurz sind, können Sie normalerweise den Ausdruck herausfinden, der mit ein oder zwei Raten abgestürzt ist. –
Im Gegensatz zu einem David-Lynch-Film lassen Debugger jedoch den Betrachter beliebig zwischen den verschiedenen Realitätsebenen hin- und herschalten. Wenn Sie Disassemblierung verstehen, dann macht das einzelne Durchlaufen (mit den eingestreuten Quellzeilen) in der Regel auch bei der Optimierung Sinn. Wenn Sie die Demontage nicht verstehen, werden Sie lernen. –
Hier ist ein Teil von einem Makefile, das ich regelmäßig verwende (in diesem Beispiel wird versucht, ein Programm mit dem Namen foo zu erstellen).
Wenn Sie es wie $ make BUILD=debug
oder $ make debug
dann die Debug CFLAGS verwendet werden ausgeführt. Diese schalten die Optimierung aus (-O0
) und enthalten Debugsymbole (-g
).
Wenn Sie diese Flags weglassen (durch $ make
ohne zusätzliche Parameter ausgeführt wird), werden Sie bauen die Veröffentlichung CFLAGS-Version, wo Optimierung auf (-O2
) eingeschaltet ist, Debugging-Symbolen (-s
) und Behauptungen deaktiviert (-DNDEBUG
) .
Wie andere vorgeschlagen haben, können Sie mit verschiedenen Einstellungen -O*
experimentieren, abhängig von Ihren spezifischen Bedürfnissen.
ifeq ($(BUILD),debug)
# "Debug" build - no optimization, and debugging symbols
CFLAGS += -O0 -g
else
# "Release" build - optimization, and no debug symbols
CFLAGS += -O2 -s -DNDEBUG
endif
all: foo
debug:
make "BUILD=debug"
foo: foo.o
# The rest of the makefile comes here...
- 1. Gebaut mit Optimierungen aktiviert oder ohne Debuginformationen
- 2. GCC Standard Optimierungen Verhalten
- 3. So deaktivieren Sie alle Optimierungen in GCC
- 4. Wie erkennt man, wenn Gebäude mit Adressdesinfizierer beim Bauen mit gcc 4.8 gebaut wird?
- 5. Wie können Sie wissen, welche Optimierungen in gcc aktiviert sind?
- 6. Was sind die teuren Optimierungen von GCC?
- 7. Welcher ist besser, gcc oder armcc für NEON-Optimierungen?
- 8. Wie wird WordPress '.htaccess und SEO gebaut?
- 9. Leichte Spinlocks, die aus atomaren Operationen des GCC gebaut wurden?
- 10. Eclipse-Optimierungen
- 11. Gleitkomma-Optimierungen - Richtlinie
- 12. Destringierung im GCC-Preprocessor
- 13. Tensorflow android Beispiel wird nicht gebaut
- 14. Viewstate Optimierungen
- 15. llvm Optimierungen
- 16. Android-Build schlägt fehl, wenn mit Eclipse gebaut wird
- 17. LINQ-Optimierungen für IOrderedEnumerable
- 18. Wird Apple akzeptieren, wenn die App mit Base SDK iOS4.1, nicht mit iOS4.2 gebaut wird?
- 19. CSS Regenbogen gebaut mit Farbverlauf
- 20. CUDA Reduzierung Optimierungen
- 21. Mac-spezifische Optimierungen in ~/.gitconfig
- 22. Wert vorübergehend nicht verfügbar, aufgrund von Optimierungen im Stream
- 23. Wie wird C For-Loop-Körper mit GCC ausgerichtet?
- 24. Wie wird eine neue gcc-Version mit brew verlinkt?
- 25. JIT-Optimierungen vom Feinsten
- 26. GCC: Programm funktioniert nicht mit Kompilierungsoption -O3
- 27. Optimierungen für endgültiges Schlüsselwort
- 28. Umgebungsvariable LIBRARY_PATH wird nicht verwendet/wird mit gcc gelesen
- 29. C-Grammatik im GCC-Quellcode
- 30. Jenkins - Pass Build-Name zu Code wird gebaut
Ich tat und konnte keine direkte Erklärung finden. Ich könnte aber nur auf Suche lutschen. – Polaris878
Außerdem ist der Punkt von SO, in Suchmaschinen wie Google aufzutauchen, also ist es besser, es hier sowieso zu haben. – Polaris878
Fairer Anruf. Wolltest du das? Oder brauchst du ein bisschen mehr Kontext/Info? – Josh