Compileroptionen

Der Compiler ist dazu da aus dem Quelltext eines Programms ausführbaren Code zu erstellen. Dabei gibt es jedoch nicht nur eine Möglichkeit das zu Realisieren, und nicht immer ist der gleiche Weg der Beste. Wenn wir zum Beispiel ein Programm compilieren möchten, das auf einem Gerät mit sehr eingeschränktem Speicherplatz verwendet werden soll, dann sollte die ausführbare Datei des Programms sehr klein sein. Ob dabei das Programm etwas langsamer wird ist uns dann nicht so wichtig. Es könnte aber auch genau die entgegengesetzte Situation eintreten, dass unser Programm so schnell wie möglich sein soll, und uns der Speicherbedarf mehr oder weniger egal ist. Genau um solche und viele andere Sachen beim Compilieren zu steuern gibt es Compileroptionen. Da diese bei jedem Compiler anders ausschauen müssen wir jeden Compiler extra durchgehen.

gcc/g++

Steuerung der Ausgabe
-o name Gibt den Namen der zu erstellenden ausführbaren Datei an.
-c Kompiliert nur alle Dateien ohne sie zu linken.
-llib (kleines L) Linkt den kompilierten Code mit der angegeben statischen Bibliothek lib.a.
Bekanntestes Beispiel: -lm, um die mathematischen Funktionen für #include <math.h> zu kompilieren.
-IPfad (großes i) Sucht zusätzlich im angegeben Pfad nach Include Dateien.
-DKonstante Definiert die angegeben Preprozessorkonstante. Diese wird standardmäßig mit dem Wert 1 definiert.
-DKonstante=Wert Definiert die angegeben Preprozessorkonstante mit dem angegebenen Wert.
Optionen zum Debugging und zur Fehlersuche
-Wall Aktiviert die Ausgabe aller Warnungen. Diese Option sollte man eigentlich immer verwenden, da man dadurch auf sehr viele Fehler aufmerksam gemacht wird. Z.B.: Fehlende Return Anweisungen, unbenutzte Variablen, konstante if-Abfragen…
-Wwrite-strings Liefert bei gcc eine Warnung, bei der Zuweisung von konstanten Strings auf char *
-Wextra Aktiviert zusätzliche Warnungen die nicht mit -Wall aktiviert werden. -Wall muss man jedoch weiterhin extra angeben.
-Weffc++ (nur g++) Warnt bei Verletzung einiger Richtlinien aus Scott Meyers' Büchern „Effective C++“ und „More Effective C++“. Es kann dabei auch passieren das Standardheader nicht immer alle Richtlinien einhalten und daher Warnungen erzeugen.
-pedantic Überprüft den Code auf die Einhaltung des ISO C/C++ Standards. Auch diese Funktion ist sehr empfehlenswert, da durch Einhaltung der Standards der Code von den meisten verfügbaren Compilern compiliert werden sollte.
-g Erzeugt Debugging Informationen im Code und ermöglicht so das Debuggen des Programmes z.B. mit dem GDB (GNU Debugger)
Steuerung der Optimierung des Codes
-O0 Deaktiviert jegliche Optimierungen. Das ist die Standardeinstellung wenn nichts anderes angegeben wird.
-O Optimierung der Größe von Programm und der Ausführungszeit. Hier werden nur einfache und schnell durchführbare Optimierungen durchgeführt.
-O1 Optimiert schon etwas mehr als -O und führt auch Optimierungen durch die die etwas länger dauern können.
-O2 Hier werden schon fast alle möglichen Optimierungen bis auf Functioninlining und Loopunrollung durchgeführt.
-O3 Führt alle möglichen Optimierungen wie z.B. auch Functioninlining und Loopunrolling durch.
-Os Optimiert den Code auf minimale Größe. Dabei kann die ausführbare Datei etwas langsamer werden, da zum Beispiel meist kein Funktionsinlining durchgeführt wird, sondern ein Funktionsaufruf gemacht wird, der natürlich langsamer ist.

|Autorendiskussion