Das Ausführen eines C++ -Programms mit TDM GCC 5.1.0 unter Windows
Leider fehlte noch die Zeit, um diese Lektion zum Thema der Bedienung eines Compilers ausführlicher auszuarbeiten.
Im Unterrichtsraum wird der Dozent den Teilnehmern eines Kurses die Bedienung des vorhandenen Compilers so lange erklären, bis jeder damit zurechtkommt, und eventuelle Fragen zur Bedienung beantworten.
Außerhalb eines Unterrichts könnte es nötig werden, etwas in der Bedienungsanleitung des verwendeten Compilers zu lesen, um die Bedienung zu erlernen.
TDM GCC 5.1.0
TDM GCC 5.1.0 ist ein Software-Paket, das einen C++-Compiler enthält.
Finden der Software im Web
TDM GCC 5.1.0 kann durch eine Suchanfrage wie [MinGW GCC 5.1 zip] gefunden werden. Beispielsweise konnte man damit die folgende URI finden.
- URI
http://tdm-gcc.tdragon.net/download
Installation
Die Installation kann durch ein Installationsprogramm erfolgen. Hierbei ist darauf zu achten, die für das verwendete Betriebssystem (32- oder 64-Bit) passende Version auszuwählen.
Die Installation ist auch ohne Administratorkonto möglich und scheint auch den Suchpfad des Benutzers selbständig korrekt zu erweitern.
Der Aufruf
Nach der Installation ist eine Quelldatei »main.cpp« mit dem C++-Quelltext anzulegen und danach der Compiler wie folgt aufzurufen.
- Einfache Kommandozeile zum Compilieren
c++ -std=c++17 main.cpp
- Kommandozeilem mit diversen Optionen (nur als Beispiele)
c++ -std=c++17 -msse2 -march=native -Ofast -O3 -g -pedantic -pedantic-errors -Werror=narrowing -Wall -W -Wconversion -Wextra -Weffc++ -Wno-parentheses -pthread -lpthread -D_GLIBCXX_DEBUG -D__USE_MINGW_ANSI_STDIO -Wno-unused-parameter -Wno-unused-variable -Wno-empty-body -Wno-unused-but-set-variable main.cpp
c++ -std=c++17 -msse2 -march=native -Ofast -O3 -fgcse -fgcse-las -pedantic -pedantic-errors -Werror=narrowing -Wall -W -Wconversion -Wextra -Weffc++ -Wno-parentheses -D__USE_MINGW_ANSI_STDIO -Wno-unused-parameter -Wno-unused-variable -Wno-empty-body -Wno-unused-but-set-variable -Wstrict-overflow=5 -Wsuggest-attribute=pure -Wsuggest-attribute=const -Wsuggest-attribute=noreturn -Wsuggest-attribute=format -Wmissing-format-attribute -Wsuggest-final-types -Wsuggest-final-methods -Wsuggest-override -Warray-bounds=2 -Wwrite-strings -Werror=zero-as-null-pointer-constant main.cpp 1>transcript.txt 2>&1
Nach erfolgreicher Kompilierung entsteht »a.exe« und kann durch Eingabe des Namens gestartet werden. Der Name lehnt sich an den Namen des Kompilats unter UNIX an: »a.out« steht dort für „assembler output “.
Erweiterung des Suchpfades
Damit der Compiler »c++« aufgerufen werden kann, muß der Pfad des bin-Verzeichnis der Installation (also des oben hergestellten Verzeichnisses) zur Suchpfadliste des Kommandozeileninterpretierers hinzugefügt werden.
Dies ist nur dann nötig, wenn es nicht schon durch das Installationsprogramm erledigt wurde, was daran erkannt werden kann, daß »c++« als „unbekanntes Kommando“ angesehen wird.
Dabei ist in dem folgenden Beispiel »C:\example\bin« durch das tatsächliche bin-Verzeichnis der Installation zu ersetzen.
- Kommandozeile zum Erweitern der Suchpfadliste (ungetestet)
set "PATH=%PATH%;C:\example\bin"
- (an Stelle von »C:\example\bin« den Pfad des bin-Verzeichnisses einsetzen)
Autohotkey
Autohotkey ist ein Programm, das die Arbeit durch Bereitstellung von Tastaturkürzeln erleichtern kann, aber nicht unbedingt benötigt wird.
In diesem Abschnitt finden sich einige Notizen dazu.
- AutoHotkey.cmd
Start AutoHotkey.exe AutoHotkey.txt
- AutoHotkey.txt
run_java_main() {
SetTitleMatchMode 3
IfWinExist, %A_WinDir%\system32\cmd.exe
WinClose
IfWinExist, %A_WinDir%\system32\cmd.exe
WinClose
SetTitleMatchMode RegEx
IfWinExist, i)main\.cpp - (Editor|Notepad)
WinActivate
Else
Run %A_WinDir%\notepad.exe %A_MyDocuments%\homeqcp\main.cpp
Send ^s
Run "%A_MyDocuments%\homeqcp\Main.cmd",%A_MyDocuments%\homeqcp
Return
}^R::
run_java_main()
Return^E::
SetTitleMatchMode RegEx
IfWinExist, i)main\.cpp - (Editor|Notepad)
WinActivate
Else
Run %A_WinDir%\notepad.exe %A_MyDocuments%\homeqcp\Main.cpp,,Max
Return^H::
SetTitleMatchMode 2
IfWinExist, homeqcp
WinActivate
Else
Run %A_WinDir%\explorer.exe /n`,/e`, %A_MyDocuments%\homeqcp,,Max
Return^Z::
Send ^c
SetTitleMatchMode RegEx
IfWinExist, i)main\.cpp - (Editor|Notepad)
WinActivate
Else
{
Run %A_WinDir%\notepad.exe %A_MyDocuments%\homeqcp\Main.cpp,,Max
sleep, 999
}
sleep, 99
Send ^a
Send ^v
run_java_main()
Return^B::
Send ^c
SetTitleMatchMode RegEx
IfWinExist, i)main\.cpp - (Editor|Notepad)
WinActivate
Else
{
Run %A_WinDir%\notepad.exe %A_MyDocuments%\homeqcp\Main.cpp,,Max
sleep, 999
}
sleep, 99
Send ^a
SendInput {#}include <iostream>{enter}{#}include <ostream>{enter}{#}include <string>{enter}{enter}using namespace ::std::literals;{enter}{enter}int main() {{} ::std::cout <<
Send ^v
Send {space} << "\n"s; {}}
run_java_main()
Return^D::Run, cmd /c start Firefox https://docs.oracle.com/javase/8/docs/api/,,Max
^O::
Run, cmd /c start Firefox http://www.google.de,,Max
Return:*?:qpp::
SendInput ::std::cout << 0 << "\n"s;
return
Alternative Optionen zur Optimierung *
[V] Folgende Befehle beim Compiler-Aufruf hinzufügen
-mwindows -msse2 -march=native -Ofast -O3 -std=c++17 -pedantic -pedantic-errors -Werror=narrowing -Wall -W -Wconversion -Wextra -Weffc++ -Wno-parentheses -Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable -pthread -g -lpthread -D_GLIBCXX_DEBUG -D__USE_MINGW_ANSI_STDIO
[V] Folgende Befehle beim Compiler-Aufruf hinzufügen
-msse2 -march=native -Ofast -O3 -std=c++17 -pedantic -pedantic-errors -Werror=narrowing -Wall -W -Wconversion -Wextra -Weffc++ -Wno-parentheses -Wno-unused-parameter -Wno-unused-variable -pthread
Verwendung unter cmd (Windows ) *
(So ähnlich erfolgreich erprobt in Unterrichtsräumen in Reinickendorf und Pankow im Februar 2016.)
- Konsole oder cmd-Datei
set "PATH=%PATH%;C:\Program Files (x86)\Dev-Cpp\MinGW64\bin\g++.exe"
g++ -m32 main.c
a
PAUSE
Der Pfad am Ende der ersten Zeile kann bei jeder Installation anders lauten. Dies muß der Ordner mit dem Compiler »g++« sein.
Unter Umständen muß oder kann die Option »-m32« auch entfallen.
Statt »g++« kann manchmal auch »C++« geschrieben werden.
Hinter »g++« können auch noch die weiter oben angegebenen Optionen (»-O3 …«) geschrieben werden.
Verwendung unter Linux *
Abfragen der Linux -Version.
- Konsole
uname -or
3.2.0-4-amd64 GNU/Linux
cat /etc/debian_version
7.9
Prüfen, ob der Compiler schon installiert wurde.
- Konsole
which g++
/usr/bin/g++
Version ermitteln.
- Konsole
ls -l /usr/bin/gcc
/usr/bin/gcc -> gcc-4.7
Nach anderen Versionen suchen
- Konsole
ls -l /usr/bin/gcc*
/usr/bin/gcc -> gcc-4.7
/usr/bin/gcc-4.6
/usr/bin/gcc-4.7.
Version des Compilers anzeigen lassen:
- Konsole
gcc --version
gcc (Debian 4.7.2-5) 4.7.2
gcc-4.6 --version
gcc-4.6 (Debian 4.6.3-14) 4.6.3
Compiler aufwendig suchen lassen:
- Konsole
find / -name "gcc*"
Ein C++ -Programm »main.cpp« schreiben.
- Konsole
echo '#include <iostream>' >main.cpp
echo 'int main()' >>main.cpp
echo '{ ::std::cout << "Hallo, Welt!" << "\\n"; }' >>main.cpp
cat main.cpp#include <iostream>
int main()
{ ::std::cout << "Hallo, Welt!" << "\n"; }
Aus dem C++ -Programm »main.cpp« eine ausführbare Datei »./a.out« machen.
- Konsole
g++ main.cpp
Die ausführbare Datei »./a.out« starten.
- Konsole
./a.out
Hallo, Welt!
Aus dem C++ -Programm »main.cpp« eine ausführbare Datei »./a.out« machen und dabei die oben empfohlenen Optionen verwenden. (Bei älteren Compilern muß »c++14« durch »c++11« ersetzt werden. Bei noch älteren Compilern müßte »-std=c++14« ganz weggelassen werden.)
- Konsole
g++ -O3 -std=c++11 -g -pedantic -pedantic-errors -Werror=narrowing -Wall -W -Wconversion -Wextra -Weffc++ -Wno-parentheses -pthread -lpthread -D_GLIBCXX_DEBUG -D__USE_MINGW_ANSI_STDIO -Wno-unused-parameter -Wno-unused-variable main.cpp
./a.out
Hallo, Welt!
Die Installation (veraltete Anleitung) *
Diese Anleitung braucht bei Verwendung des Installationsprogramms nicht berücksichtigt zu werden.
Die folgenden vier Zip-Archive sollten in der unten gegebenen Reihenfolge alle in dasselbe Verzeichnis entpackt werden. Zuvor entpackte Dateien sollten dabei eventuell durch später entpackte Dateien überschrieben werden.
Auf der Seite »http://tdm-gcc.tdragon.net/download« finden sich viele Dateinamen, die den unten angegebenen Dateinamen zum Verwechseln ähnlich aussehen. Es ist darauf zu achten, genau die unten angegebenen Dateien zu kopieren! Die Ursache merkwürdiger Fehlermeldungen könnte darin bestehen, daß nicht zusammenpassende Archive kopiert wurden.
- ZIP 0
gcc-5.1.0-tdm64-1-core.zip
heanet.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%205%20series/5.1.0-tdm64-1/gcc-5.1.0-tdm64-1-core.zip
- Auch für C notwendig
- ZIP 1
binutils-2.25-tdm64-1.zip
heanet.dl.sourceforge.net/project/tdm-gcc/GNU%20binutils/binutils-2.25-tdm64-1.zip
- rüberkopieren
- Auch für C notwendig
- ZIP 2
mingw64runtime-v4-git20150618-gcc5-tdm64-1.zip
freefr.dl.sourceforge.net/project/tdm-gcc/MinGW-w64%20runtime/GCC%205%20series/mingw64runtime-v4-git20150618-gcc5-tdm64-1.zip
- rüberkopieren
- Auch für C notwendig
- ZIP 3
gcc-5.1.0-tdm64-1-c++.zip
vorboss.dl.sourceforge.net/project/tdm-gcc/TDM-GCC%205%20series/5.1.0-tdm64-1/gcc-5.1.0-tdm64-1-c%2B%2B.zip
- rueberkopieren
- Nur für C++ notwendig