Wie baut man im Release-Modus mit Optimierungen in GCC?

Lesezeit: 4 Minuten

Benutzer-Avatar
Polaris878

Was sind die spezifischen Optionen, die ich benötige, um im „Release-Modus“ mit vollständigen Optimierungen in GCC zu bauen? Wenn es mehr als eine Option gibt, führen Sie sie bitte alle auf. Vielen Dank.

Benutzer-Avatar
Josch

http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html

Es gibt keine Einheitslösung – Sie müssen Ihre Anwendung, Ihre Anforderungen und die Optimierungs-Flags verstehen, um die richtige Teilmenge für Ihre Binärdatei zu bestimmen.

Oder die gewünschte Antwort: -O3

  • Ich tat und konnte keine einfache Erklärung finden. Ich könnte aber beim Suchen einfach scheiße sein.

    – Polaris878

    8. Oktober 2009 um 0:12 Uhr

  • Außerdem ist es der Sinn von SO, in Suchmaschinen wie Google aufzutauchen, also ist es sowieso besser, es hier zu haben.

    – Polaris878

    8. Oktober 2009 um 0:13 Uhr

  • Fairer Anruf. War es das, wonach Sie gesucht haben? Oder brauchen Sie etwas mehr Kontext/Informationen?

    – Josch

    8. Oktober 2009 um 0:14 Uhr

  • Oft werden Sie wollen -DNDEBUG auch um die Behauptungen zu entfernen.

    –Martin B

    8. Oktober 2009 um 9:46 Uhr

  • Und Sie können wollen -march=native -mtune=native auch, solange Sie die Binärdatei nicht an andere Maschinen verteilen.

    – kl

    3. September 2016 um 18:37 Uhr

Hier ist ein Teil eines Makefiles, das ich regelmäßig verwende (in diesem Beispiel versucht es, ein Programm namens foo).

Wenn du es magst $ make BUILD=debug oder $ make debug
dann ist die Debuggen CFLAGS werden verwendet. Diese schalten die Optimierung aus (-O0) und enthält Debugging-Symbole (-g).

Wenn Sie diese Flags weglassen (durch Ausführen von $ make ohne zusätzliche Parameter), erstellen Sie die Veröffentlichung CFLAGS-Version, bei der die Optimierung aktiviert ist (-O2), Debugging-Symbole entfernt (-s) und Behauptungen deaktiviert (-DNDEBUG).

Wie andere vorgeschlagen haben, können Sie mit verschiedenen experimentieren -O* Einstellungen abhängig von Ihren spezifischen Anforderungen.

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...

Beachten Sie, dass gcc keinen “Release-Modus” und keinen “Debug-Modus” wie MSVC hat. Jeder Code ist nur Code. Das Vorhandensein der verschiedenen Optimierungsoptionen (-O2 und -Os sind die einzigen, um die Sie sich im Allgemeinen kümmern müssen, es sei denn, Sie führen eine sehr feine Abstimmung durch) modifiziert den generierten Code, aber nicht in einer Weise, um die Interoperabilität mit anderen ABI-kompatiblen Codes zu verhindern Code. Im Allgemeinen möchten Sie die Dinge optimieren, die Sie veröffentlichen möchten.

Das Vorhandensein der Option “-g” bewirkt, dass erweiterte Symbol- und Quellcodeinformationen in die generierten Dateien eingefügt werden, was für das Debugging nützlich ist, aber die Größe der Datei erhöht (und Ihren Quellcode preisgibt), was Sie häufig tun möchte nicht in “freigegebenen” Binärdateien.

Aber sie sind nicht exklusiv. Sie können eine Binärdatei mit Optimierungs- und Debug-Informationen kompilieren lassen oder eine mit beidem.

  • Die Optimierung sollte jedoch normalerweise deaktiviert werden, wenn Sie beabsichtigen, den generierten Code zu debuggen, da Sie sonst feststellen werden, dass das Debuggen eine Erfahrung ist, die einem Film von David Lynch ähnelt.

    – Café

    8. Oktober 2009 um 0:37 Uhr

  • Es ist nicht so schlimm, ich schaue mir die ganze Zeit Stack-Dumps und Valgrind-Ausgaben von “Release” -Binärdateien an. Solange Sie -fomit-stack-pointer nicht verwenden und verstehen, dass Statics inline und unsichtbar sein können, können Sie selbst aus einer stark optimierten Binärdatei eine Menge Kontext lesen. Wenn Ihre Funktionen kurz sind, können Sie den Ausdruck, der abgestürzt ist, normalerweise mit ein oder zwei Raten herausfinden.

    – Andy Roß

    8. Oktober 2009 um 1:49 Uhr

  • Anders als in einem David-Lynch-Film lassen Debugger den Zuschauer jedoch nach Belieben zwischen den verschiedenen Realitätsebenen hin- und herwechseln. Wenn Sie die Disassemblierung verstehen, dann macht das Einzelschritt-Durchgehen (mit eingestreuten Quellzeilen) normalerweise auch bei Optimierung einen gewissen Sinn. Wenn Sie die Demontage nicht verstehen, werden Sie es lernen.

    – Steve Jessop

    8. Oktober 2009 um 10:29 Uhr

  • In diesem Zusammenhang gibt es Möglichkeiten, die Debug-Symbole für die Wartung in „Release“-Builds beizubehalten. Eine Möglichkeit, dies zu tun: gcc -g source.cc -o a.out; strip a.out -o a.out.syms; strip a.out. Verwenden objdump -t a.out um zu überprüfen, ob die Symbole tatsächlich entfernt wurden.

    – kizzx2

    1. Oktober 2010 um 7:09 Uhr


  • MSVC hat diese Modi auch nicht. Es ist nur eine Konvention, die von einigen Build-Systemen vorgeschlagen wird, einschließlich demjenigen, das die Visual Studio-IDE heutzutage verwendet.

    – Johan Boule

    29. August 2019 um 4:59 Uhr

-O2 schaltet alle Optimierungen ein, die keinen Kompromiss zwischen Speicherplatz und Geschwindigkeit erfordern, und ist tendenziell diejenige, die ich am häufigsten sehe. -O3 macht etwas Platz für Geschwindigkeitskompromisse (wie Funktion inline.) -Os macht O2 und macht andere Dinge, um die Codegröße zu reduzieren. Dies kann die Dinge schneller als O3 machen, 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 dass sie sehr architekturabhängig sind.

1344310cookie-checkWie baut man im Release-Modus mit Optimierungen in GCC?

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

Privacy policy