C (GCC unter Windows)

1. GCC: Einrichtung unter Windows

Die gängigsten Möglichenkeite GCC unter Windows zu benutzen ist mit Cygwin (Emulation der Unix-API unter verschiedenen Versionen von Microsoft Windows) und mit MinGW oder Code::Blocks. Code::Blocks ist eine vollständige Entwicklerumgebung und hat MinGW integeriert.Daher kann man sich die MinGW Installation & Konfiguration sparen . Ich werde mich hier Anfangs auf die nur MinGW "Variante" beziehen. MinGW enthält eine Windows Version der GCC Compliers,der es uns ermöglicht native win32 Programme in C zuschreiben.

1.1 Installation:

Die einfachste Methode MinGW zu installieren es denn den angebotenen Installer zu benutzen Installer Download.

Es gibt auch eine Manuelle Installation, auf die ich aber nicht weiter eingehen werden. Während der Installation wird gefragt ob man die Aktuelle (Current), vorherige oder eine Candidate (Beta/unstable) installieren will. Ich habe vorsichthalber Current gewählt. Anschließend wird nach dem Installationsumfang gefragt. Wir benötigen nur die "MinGW base tools" bzw denn Installationstyp "Minimal". Anschließend wählt man nur noch das Installationsverzeichnis und der Installer lädt dann die Dateien und installiert sie. Falls der Installer Probleme bei Download einer bestimmten hat Datei, kann versuchen die Datei hier seperat runterzuladen,sie dann ins gleiche Verzeichnis zu kopieren in der sich auch Installer befindet und dann zuletzt Installer neu zu starten.


1.2 Einrichtung in der Systemumgebung:

Damit "gcc" mit der "Windows Command Prompt" bzw. Windows Powershell (Start->Ausführen->cmd) genauso benutzten kann wie unter Linux/Unix mit dem Terminal/Bash/<Beliebige Unixshell> muss die Systemvariabeln editeren. Dies tut man in den Umgebungsvariabeln. Unter Vista kommt da hin über Systemsteuerung-> System -> Erweitere Systemeinstellungen -> Umgebungsvariabeln. Nun wählt man unter Systemvariabeln den Eintrag "Path" (es egal ob "path" groß oder klein geschrieben ist) und drückt "Bearbeiten". Unter "Wert der Variablen" fügt man nun ans rechte Ende der gelsiten Eintäge ein Semikolon ein gefolgt von dem Pfad zum MinGW bin Verzeichnis.

Beispiel:

MinGWInsBsp.png

Allgemeines Format: <Vorherige Einträhe>;<Pfad zur MinGW Installation>\bin

Nach einen Neustart werden dann die Änderungen übernommen.

2. Erste Schritte

Für die nie mit der "Windows Command Prompt" gearbeitet haben zeige hier,wie man sie mit "gcc" benutzt. Verdeutlichen werde ich dies an der Hello_World aus C

Als erstes öffnen wir eine Command Prompt": Start->Ausführen->"cmd" -> OK Dann landen wir im "home" Verzeichnis unseres Benutzerverzeichnisses:

 Microsoft Windows [Version 6.0.6001]
 Copyright (c) 2006 Microsoft Corporation. Alle Rechte vorbehalten.
 C:\Users\Admin>

Nun können wir erstmal testen ob MinGW richtig installiert ist indem wir "gcc --v" eingeben.

  ...
  gcc version 3.4.5 (mingw-vista special r3)
  C:\Users\Admin>

Wenn wir etwas Ausgegeben bekommen ,wo am Ende die gcc version stehet ist alles OK. Wenn nicht einfach mal nach oben die 1. durchschauen.


Nun zurück zur Hello_World.c . Da sich meine Hello_World.c im Verzeichnis D:\Code\ befinden müssen wir dort wechseln. Zuerst wechseln wir das Lauswerk:

 C:\Users\Admin>D:
 D:\>

Nun müssen ins Verzeichnis Code wechseln. Zuvor könnten wir uns mit "dir" alle im jetztigen Verzeichnis befindlichen Ordner und Dateien anzeigen lassen. Das Verzeichniss wechseln tut man mit "cd" (Change Directory):

 D:\>cd Code
 D:\Code>

Wir auch "cd" und einmal Space eintippen können und dann durch Tab(ulator) drücken den Rest von Windows vervollständigen können. Wollen wir zurück ins Übergeordnete Verzeichnis können wir dies wie in Unix/Linux mit "cd .." .


Nun kann ich die Hello_World.c ,wie ich es von gcc unter Unix/Linux gewohnt bin,compilieren.

 D:\Code>gcc  -Wall  -o Hello_World.exe  hello_world.c

Jetzt noch ein Lauzeittest.

  D:\Code>Hello_World.exe
  Hallo Freitagsrunde 4!
  D:\Code>

Wie wir sehen hat alles Funktioniert wie es sollte und alles ist gut :)

3. Debuggen unter Windows =

Debuggen unter Windows genauso wie unter Linux, man lädt GNU Source-Level Debugger runter , und kann ihn benutzen wie unter Linux. Wer eine Einführung in den GBD braucht kann die Folie von 2. Tag des C-Kurses WS08/09 empfehlen. Hat man Code::Blocks kann man sich den Download sparen. Wer komfortabler debuggen will,kann ich Code::Blocks empfehlen. Das hat einen gute GUI für (unteranderem) den GDB integriert. Diese läßt sich wie wie andere Debugger (wie z.B der aus Eclipse) bedienen.

Für die die noch nie "Debugt" haben folgt hier in der nächsten Tagen eine kleine Einführung.

POSIX & Windows

In TechGI3 wird zu Teil Posix verwendet. Für XP & 2003 Server gibt eine es "Windows Services for UNIX" einen Art "lagacy support" zum installieren. Vista Benutzter müssen größtenteils Cygwin greifen ,da sich M$ entschieden denn oben genannten Dienst nur der "Enterprice" und "Ultimate" Version exklusive anzubieten.

Tipps / Unterschiede (gcc Unix vs. gcc Windows) / Sonstiges

Jeder wird früher oder später Bekanntschaft mit Laufzeitfehlern machen. Unter Unix kriegt man immer einen schönes "Segmentation Fault" ausgegeben. Unter Windows popt ein Fenster auf das uns unsere "Programmname.exe" abgestürzt ist oder so ähnlich. Wie es aussieht hängt von der Windows Version ab.



Das Arbeiten mit Header-Datein ist zwar weniger Windows spezifisch aber ich will es hier trotzdem erwähnen weil ich Anfangs denn Compilerfeher irretierend fand. Ich versuche dies an einem Beispiel zu verdeutlichen. Angenommen wir Hauptprogramm "main.c" so wie eine "processing.c" ,in der irgendwelche benötigten Berechnung stattfinden. Ausserdem gibt es zur "processing.c" die passenden Header-Dateien "processing.h". "processing" ist im Hauptprogramm folgendermaßen eingebunden:

   #include "processing.h"

, also befinden sich alle Dateien im selben Verzeichnis.

nun Versuchen wir die main.c zu komplieren:

   gcc -o Test.exe main.c 

und der Compiler gibt uns einen Fehler so ähnlich wie denn hier zurück:

  C:\...\Temp/ccSztzgD.o:main.c:(.text+0x2b): undefined reference to `foo'
  collect2: ld returned 1 exit status

Wobei foo einen eine Funktion ist die in "processing.h" deklariert ist und in "processing.c" implementiert.


GCC erzeugt Compilat immer zuerst in einen temporären Verzeichnis (in dem Fall "Temp") und kopiert sie dann in das Verzeichnis von dem aus gcc aufgerufen haben. Der Compiler sagt uns das er die "foo" Funktion nicht finden kann, was wiederum darauf hin weißt das er die "processing.c" nicht finden kann. Das ist auch logisch da wir die "processing.h" eingebunden haben (und nicht die "processing.c") und der Compiler nach der der erzeugten/compilierten "processing.c" im Standartbiblotheks Verzeichnis sucht. Dort findet er sich natürlich nicht weil wir sich nicht compiliert haben. Die Lösung ist also die die "processing.c" gleichzeitig mit der "main.c" zu compilieren:

   gcc -o Test.exe main.c processing.c

Dann sollte alles gehen wie gewohnt.


  • Wollt ihr For-Schleifen wie in JAVA gewohnt benutzen müsst ihr bei gcc den C99 Standart einschalten beim compilieren.

BSP:

  gcc -std=c99 MemCopy.c
  Für Code::Blocks User:  Settings->Compiler and Debugger -> Tab : Compiler Settings -> Tab : Other Settings -> Einfügen: -std=c99