MinGW/gcc Parameter
-
Guten,
ich habe bis jetzt immer mit VS gearbeitet (jaja, Schande über mich :p), muss jetzt aber gezwungenermaßen (Microsoft ist halt zu dumm/faul um C99 zu implementieren? :D) auch mal gcc nutzen..
So, MinGW installiert - kein Problem.
Auch kompilieren ist ja recht simpel (gcc -o test.exe test.c).Allerdings sieht man immer wieder sachen wie
gcc -W -Wall -ansi -pedantic -O2 -o foo.o foo.c
aber das scheint denn auch alles etwas älter zu sein.Meine Frage wäre jetzt was bedeuten diese Argumente und sind diese in der jetzigen Version von gcc noch nötig?
-W und -Wall scheinen ja wohl was mit den Warnungseinstellungen zu tun zu haben, na gut.. nicht so wichtig erstmal.
Aber das -ansi bzw. (aus der gcc --help) -std=xx. Macht das einen Unterschied bei Projekten die eigentlich keinen expliziten Standard benötigen?
Und das -O2 .. soll wohl die "Codeoptimierungsstufe" einstellen. Was ist denn die höchste Einstellung hier? Und was genau sind da die Einflüsse? So wird eine Ausgabedatei bei mir mit -O3 beispielsweise größer als eine bei der ich augenscheinlich gar nichts optimiere? Ist die dann schneller oder ist es am besten sowas einfach weg zu lassen und dann "macht der gcc schon was er für gut hält :D"?
Hoffe ihr könnt mich hier etwas "entwirren", besten Dank schonmal mit voraus
-
Wenn du Platz hast und nicht gerade etwas besseres zu tun, lade dir die IDE Code::Blocks 10.05.
Die sollte deine Compiler finden. Wenn du einen der anderen vorbereiteten hast, auch die Anderen.
Da kannst du dann die Parameter der verschiedenen Compiler in einem Fenster auswählen. Es sind meiner Erinnerung nach nicht alle Compiler- oder Linkerschalter angeführt.
Jeder umfangreiche Compiler oder Linker hat da so an die geschätzt 30 bis 100 Parameter, die du auch noch kombinieren kannst.
Da du C99 vorhast solltest du das meist deinem Compiler mitteilen müssen.
Auch VS unter der IDE hat diese Parameter. Jeder Compiler hat natürlich seine speziellen
MfG f.-th.
-
Danke für deine Bemühungen aber du hast leider keine einzige meiner Fragen beantwortet
-
Da du unter VS die Schalter angeblich nicht gesetzt haben willst, was ich bezweifele, wie im vorigen Post schon angedeutet, wirst du bei einfachen Projekten auch beim gcc nur sehr wenige "Parameter" setzen brauchen. Die IDE bei VS hat die Parameter für dich verwaltet
Klicke bei deinem VS mal alle Menues durch und schaue in der Dokumentation nach.
Hast du jedoch nur minimal abweichende Ideen musst du entsprechend reagieren.
Dies gilt auch für die aktuellen Versionen des Gcc und der anderen Compiler.Beispiel:
-Wall -> alle Warnungen ausgeben um einen möglichst guten und portabelen Programmierstil zu entwickeln
-ansi -pedantic -> versuchen dich möglichst nah an den Normen zu halten
http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.htmlMfG f.-th.
-
Hier noch eine Auswahl der Normen:
http://gcc.gnu.org/onlinedocs/gcc/C-Dialect-Options.htmlNach welcher möchtest du programmieren?
MfG f.-zh
-
Also deine Hilfe ehrt mich wirklich, aber Du hast immer noch keine einzige Frage beantwortet..
Hier vielleicht noch mal um das ganze etwas klarer zu machen:
- Inhalt main.c:
#include <stdio.h> int main() { fprintf(stdout, "Hallo, Welt!\n"); return 0; }
- Welche Unterschiede treten bei folgenden Anweisungen auf:
1. gcc -o test.o main.c
2. gcc -o test.o -std=c99 main.c
3. gcc -o test.o -O3 main.c
-
Hier will dir gesagt werden:
1. Du brauchst nicht GCC, um deine Probleme zu lösen.
2. Schau in deiner IDE nach, da stehen schon sehr viele Optionen drin.Da du ja anscheinen sehr hartnäckig/neugierig bist, hier mal ein paar Optionen:
-O, -O1, -O2, -O3: verschiedene Optimierungsstufen, O3 ist die mit den meisten Optimierungen, da hier aber sehr viel herumgespielt wird, wird oft -O2 genommen
-Os: Optimierung nicht für Geschwindigkeit, sondern für Größe der Executable
-s: Strippt alle Symbole aus der EXE und reduziert die Größe meist signifikant, darf nicht für Debugging-Binaries verwendet werden
-c99: Aktiviert C 99 (Was auch sonst?)
-g: Setzt Debug-Symbole
-pg: Die EXE erzeugt eine Profile-Datei, die du mit Hilfe von gprof analysieren kannst, benötigt -g
-W: Unterdrückt Warnungen
-Wall, -Wextra: Aktiviert mehr Warnungen
-pedantic: Aktiviert Warnungen nach ISO C90 oder ISO C++03 (oder war's C++98?)
-Weff-c++: Aktiviert Effective-C++-Warnungen (es gibt noch mehr Warnungen, die ich hier aber nicht aufliste)
-Wno-unused-parameters: Warnt nicht wegen unbenutzten Parametern (finde ich manchmal lästig, z.B. bei virtuellen Funktionen, die diese Parameter nur manchmal benötigen)
-fno-rtti, -fno-exceptions: Deaktiviert RTTI bzw. Exception Handling
-std=c++0x: Aktiviert den C++0x-Standard, darf nicht mit -ansi verwendet werden
-ansi: Entfernt GCC-Erweiterungen wie z.B. binäre Konstanten
-fomit-frame-pointer: Optimierung, kann ich nicht beurteilen, Originaltext von Code::Blocks: "Don't keep the frame pointer in a register for functions that don't need one"
-
..
Wie wirken sich die Optionen -O -O1.. denn ca. aus? Wenn ich beispielsweise ein Programm einmal ganz ohne -O erstelle, einmal mit -O2 und einmal mit -O3 ändert sich am output gar nichts.. könnte das an einem kleinen Quelltext liegen an dem es dann nichts mehr zu optimieren gibt? Wie sieht das Standardverhalten von gcc aus für den Fall dass ich gar keine -O Option übergebe? Gar keine Optimierung? Und warum wird auf -O3 oft verzichtet? Du schreibst dass da sehr viel herrumgespielt wird.. wo ist hier der Nachteil?
Und das -std=c99 c99 aktiviert ist klar, nur wie wirkt sich das aus? Wenn ich zB. einmal mit -std=c99 und einmal ohne kompiliere wird mit die outputdatei bei -std=c99 61KB groß, während sie ohne 35KB groß wird. Woran liegt das?
-
cooky451 schrieb:
..
Wie wirken sich die Optionen -O -O1.. denn ca. aus? Wenn ich beispielsweise ein Programm einmal ganz ohne -O erstelle, einmal mit -O2 und einmal mit -O3 ändert sich am output gar nichts.. könnte das an einem kleinen Quelltext liegen an dem es dann nichts mehr zu optimieren gibt? Wie sieht das Standardverhalten von gcc aus für den Fall dass ich gar keine -O Option übergebe? Gar keine Optimierung? Und warum wird auf -O3 oft verzichtet? Du schreibst dass da sehr viel herrumgespielt wird.. wo ist hier der Nachteil?
Und das -std=c99 c99 aktiviert ist klar, nur wie wirkt sich das aus? Wenn ich zB. einmal mit -std=c99 und einmal ohne kompiliere wird mit die outputdatei bei -std=c99 61KB groß, während sie ohne 35KB groß wird. Woran liegt das?
Das mit den Optimierungen ist schwierig zu sagen, das musst du selbst ausprobieren. -O3 ist AFAIK vielleicht etwas riskant und zudem wird durch solche Optimierungen der Code vergrößert... da kommts dann auf das letzte Quäntchen auch nicht mehr an. Vielleicht steht ja auf der GCC-Seite mehr dazu.
Ich habe mal versucht, so statische Beispielberechnungen mit einer Schleife, in der n mal ein Wert m zu einer Summe dazuaddiert wird, gemacht. Erst als ich beide Variablen per Programmargument übergeben habe, kam eine relevante Zeit heraus, sonst wurde das immer optimiert (bei O2 oder O3, glaube ich).
Ich habe auch schon mal in eine Assemblerdatei geschaut, die bei einem Code der Artint main() { return pow(2, 5); }
herauskam. Da stand nichts mehr von pow, es stand dann nur noch 32 drin.
Vielleicht sind bei C99 mehr Libraries dabei?
-
Da du dir noch keine Gedanken gemacht hast warum du C99 programmieren willst, hier ein Beispiel:
#include <stdio.h>
int main()
{
printf("C99 test\n");
int t = 99;
printf("Dies ist C%i\n", t);
}Versuche das mal
cooky451 schrieb:
- Welche Unterschiede treten bei folgenden Anweisungen auf:
1. gcc -o test.o main.c
2. gcc -o test.o -std=c99 main.c
3. gcc -o test.o -O3 main.cmit deinen 3 Aufrufen.
MfG f.-th.
-
#include <stdio.h> int main() { printf("C99 test\n"); int t = 99; printf("Dies ist C%i\n", t); }
so sollte es
-
f.-th. schrieb:
#include <stdio.h> int main() { printf("C99 test\n"); int t = 99; printf("Dies ist C%i\n", t); }
so sollte es
Ausgabe ist immer:
C99 test Dies ist C99
Bei -std=c99 ist (wie schon erwähnt) die bin. Datei ca. doppelt so groß.
Und inwiefern bringt mich das jetzt weiter?
Edit:
Na gut, wenn ich mit -std=c89 kompiliere kommt immerhin eine kurze Warnmeldung wegen der späten Deklaration. Aber.. mehr Infos hab ich da jetzt trotzdem nicht@wxSkip
-Du schreibst -O3 sei riskant, wie genau? Sind da noch bugs im Compiler vorhanden? Oder ist es nur "riskant" weil viel weg optimiert wird? Denn das kann einem (normalerweise) doch nur recht sein oder?-Dass bei C99 mehr Libraries dabei sind dürfte bei der Code größe eigentlich keinen Unterschied machen.. (es werden ja nur die Dateien gelinkt die auch benötigt werden). Allerdings scheinen die C99 libs wirklich einfach wesentlich größer zu sein.. schon komisch..
--
Naja da das ganze wohl relativ unwichtig zu sein scheint kompiliere ich denn halt einfach mit -O3 und ohne expliziten Standard..
-
cooky451 schrieb:
Na gut, wenn ich mit -std=c89 kompiliere kommt immerhin eine kurze Warnmeldung wegen der späten Deklaration. Aber.. mehr Infos hab ich da jetzt trotzdem nicht
-std=c89 die Warnmeldung bedeutet du hältst dich nicht an die Norm, das heisst ein C89-Compiler der reinen Lehre kann diesen Quelltext so nicht übersetzen.
Du kannst den gcc so einstellen das er sich wie z.B. ein C89-Compiler verhält:
-std=c89 -pedantic -WallWarum willst du überhaupt C99 compilieren können, wenn du nicht bereit bist dich damit auseinander zu setzen
Bleib doch bei VS2010. Die gehen doch ihren eigenen Weg bezüglich C, den meines Wissens kein anderer Compiler übersetzen kann, wenn da einige des MS-Futures zum Einsatz kommen.
MfG f.-th.
-
Das mit dem -O3 musst du nachschauen, das war nur aus dem Hinterkopf geholt.
Allerdings hat die Library-Größe durchaus Einfluss, wenn du bei GCC 4.5.1 nur <iostream> inkludierst (C++), ohne es zu verwenden, ist deine Datei schon 470 KB groß (Mit Symbole entfernen).
-
@f.-th. Also tut mir ja leid, aber ich glaube Du hast bis jetzt noch immer keine Frage richtig verstanden..^^
@wxskip Größere libs != mehr libs
Aber gut wie gesagt, ich nutze jetzt einfach -O3, sollte schon passen so.
-
Alles hier nachzulesen:
http://gcc.gnu.org/onlinedocs/gcc/Invoking-GCC.html#Invoking-GCC
Den Standard wie z.B. C90 oder C99 usw. findest du unter "C Dialect Options".
Was "-O2" usw. bedeuted steht unter "Optimize Options".
-
cooky451 schrieb:
... ich nutze jetzt einfach -O3, sollte schon passen so.
Les dir mal bitte diese Seite ganz durch: http://www.gentoo.org/doc/de/gcc-optimization.xml
evtl. bist du mit "-O2" besser unterwegs...
-
stefan-tiger schrieb:
cooky451 schrieb:
... ich nutze jetzt einfach -O3, sollte schon passen so.
Les dir mal bitte diese Seite ganz durch: http://www.gentoo.org/doc/de/gcc-optimization.xml
evtl. bist du mit "-O2" besser unterwegs...
Hm.. schade, dass sie da keine Beispiele genannt haben..
Aber dann werde ich wohl doch lieber mit -O2 kompilieren