Sitzung: Jeden Freitag in der Vorlesungszeit ab 16 Uhr c. t. im MAR 0.005. In der vorlesungsfreien Zeit unregelmäßig (Jemensch da?). Macht mit!

C (GCC unter Windows): Unterschied zwischen den Versionen

Zeile 1: Zeile 1:
 
 
= 1. GCC: Einrichtung 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.
 
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.
Zeile 82: Zeile 81:
  
  
Das Arbeiten mit Header-Datein ist zwar weniger Windows spezifisch aber ich will es hier trotzdem erwähnen weil Anfangs denn Compilerfeher irretierend fand.  
+
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.
 
Ich versuche dies an einem Beispiel zu verdeutlichen.
Angenommen wir Hauptprogramm "main.c" so wie eine "processing.c" ,in der wie die Berechnung stattfinden.
+
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".
 
Ausserdem gibt es zur "processing.c" die passenden Header-Dateien "processing.h".
 
"processing"  ist im Hauptprogramm folgendermaßen eingebunden:
 
"processing"  ist im Hauptprogramm folgendermaßen eingebunden:
Zeile 94: Zeile 93:
 
     gcc -o Test.exe main.c  
 
     gcc -o Test.exe main.c  
  
und der Compiler einen Fehler so ähnlich wie denn hier:
+
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'
 
   C:\...\Temp/ccSztzgD.o:main.c:(.text+0x2b): undefined reference to `foo'
 
   collect2: ld returned 1 exit status
 
   collect2: ld returned 1 exit status
  
 
Wobei foo einen eine Funktion ist die in "processing.h" deklariert ist und in "processing.c" implementiert.
 
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 hat.
+
 
Der Compiler sagt uns das er die "foo" Funktion nicht finden kann, dass darauf hin  das er die  "processing.c" nicht finden kann.
+
 
Das ist auch logisch da wir die "processing.h" eingebunden und der Compiler nach der der erzeugten "processing.c" im Standartbiblotheks Verzeichnis sucht.
+
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.  
 
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:
 
Die Lösung ist also die die "processing.c" gleichzeitig mit der "main.c" zu compilieren:

Version vom 19. Oktober 2008, 11:08 Uhr

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.

Ich werde mich hier auf die 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 :)


Probleme / Unterschiede (gcc Unix vs. gcc Windows)

Jeder wird früher oder später Bekanntschaft machen mit Laufzeitfehlern machen. Unter Unix kriegt man immer einen schönes "Segmentation Fault" ausgeben. Unter Windows popt ein ein Fenster auf das uns unsere "Programmname.exe" abgestütz ist oder so ähnlich. Wie 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.