Advanced Java Services | Eclipse CDT FAQ |
Im folgenden werden einige Einstellungen erläutert, die zum Entwickeln von C/C++ Programmen mit Eclipse nützlich oder notwendig sind. Da die ersten vier Punkte (Anlegen eines C-Projekts, Compilieren und Linken, Run, Hello World) zusammenhängen stehen sie am Anfang dieser FAQ-Liste, im Anschluß daran ist die Liste alphabetisch geordnet.
Etwas schneller geht es mit dem Kürzel Ctrl + n
Wie beim Anlegen eines C-Projekts beginnt man mit dem Kürzel Ctrl + n
Man wählt ein "Hello World C++ Project" und entfernt dann den Haken der Checkbox "Show project types...". Auf diese Weise sieht man alle Toolchains. Da wir MinGW installiert haben können wir "MinGW GCC" auswählen.
Dieser Schritt ist für C- und C++ Programme derselbe. Bevor man ein Programm starten kann muß man es Compilieren und Linken (Build-Vorgang). Über das Menu Project kann man Build auswählen und Eclipse erledigt das (falls kein Syntaxfehler im Code ist). Etwas schneller geht es mit dem Kürzel Ctrl+b.
Nach dem Build sollte bereits eine exe-Datei im Eclipse-Projektverzeichnis vorliegen.
Um sie aus Eclipse heraus starten zu können muß eine neue Run Configuration erstellt werden. Neben dem weißen Dreieck auf grünem Grund läßt sich ein kleines Kontextmenü öffnen.
Dadurch erreichen wir den folgenden Dialog.
Durch einen Doppelclick auf "C/C++ Application" wird für das zugehörige Projekt eine neue Run Configuration erstellt und die exe-Datei automatisch eingetragen.
Jetzt braucht man nur noch auf den "Run"-Button drüücken...
Will man das Programm nach Änderungen erneut starten, so geht das mit dem Shortcut Ctrl F11 am schnellsten.
Hier ein Hello World Programm und die Ausgabe im Konsolfenster von Eclipse.
#include <stdio.h> #include <stdlib.h> int main(void) { puts("Hello World"); /* prints Hello World */ return EXIT_SUCCESS; }
Hier ein Hello World Programm und die Ausgabe im Konsolfenster von Eclipse.
#include <iostream> using namespace std; int main() { cout << "Hello World mit C++" << endl; // prints Hello World return 0; }
Run -> Run Configurations... -> Tab Arguments aktivieren -> Argumente in das Textfeld "Program arguments" eintragen.
Zeilen markieren -> CTRL SHIFT /
Automatisches Speichern vor einem Build oder Run ist nicht voreingestellt. So ändert man das:
Window -> Preferences -> Run/Debug -> Launching
Radiobutton bei "Save required dirty editors before launching" setzen.
Project -> Properties -> C/C++ Build -> Settings -> GCC C Compiler -> Miscellaneus
Hier kann man zusätzliche Flags setzen. Die C99-Einstellungen errreicht man mit (irgend)einem der
folgenden Flags: -posix oder -D__USE_MINGW_ANSI_STDIO oder am sprechendsten mit -std=c99.
Dann kann man neuere Datentypen wie etwa "long long" einlesen und ausgeben.
Project -> Properties -> C/C++ Build -> Settings -> GCC C++ Compiler -> Tab Tool Settings
Im Textfeld "Command" trägt man nach "g++" den Term "-std=c++11" ein.
Sehr verwirrend ist, daß Eclipse neue C++11 Funktionen zum Teil nicht erkennt, so werden z.Bsp. die Funktionen std::move (aus dem Include <utility>) und die Funktionen std::begin() und std::end() (aus dem Include <iterator>) nicht erkannt und es erscheint eine Fehlermeldung wie "function xxx cannot be resolved" . Trotzdem läßt sich das Programm starten und zur Laufzeit werden die verwendeten Funktionen problemlos aufgerufen.
Trotzdem läßt sich das Programm starten und zur Laufzeit werden die verwendeten Funktionen problemlos aufgerufen.
Leider reichen hier die Compilereinstellungen nicht, man muß Eclipse auch noch sagen, daß es für die Fehlermeldungen den C++11 Standard verwenden soll.
Project -> Properties -> C/C++ General -> Path and Symbols -> Tab [Symbols] -> Languages -> GNU C++
Hier muß man einen neuen Eintrag machen, das Symbol "__cplusplus"
mit dem Wert "201103L"
Nach Apply verlangt Eclipse eine Bestätigung für einen neuen Build.
Es kann sein, daß man das Projekt schließen und wieder öffnen muß, bevor die Einstellung wirksam wird (oder sogar Eclipse beenden muß und neu starten)
Dank an stackoverflow, die diese Einstellung veröffentlich hat.
Der Grund ist, daß diese Konstante in Preprozessordirektiven verwendet wird. So implememtiert z.Bsp. MinGW das Template vector in stl_vector.h und darin findet man u.a. die folgenden Zeilen
#if __cplusplus >= 201103L void push_back(value_type&& __x) { emplace_back(std::move(__x)); } template<typename... _Args> void emplace_back(_Args&&... __args); #endif
Wenn also diese Konstante nicht gesetzt ist, dann erkennt Eclipse beim "Errorchecking" diese Methode nicht.
Eclipse bietet vier verschiedene Stile an, K&R (Kernighan&Ritchie), BSD, GNU und Whitesmiths. Auf der Grundlage eines der eingebauten Codestyles kann man auch einen eigenen entwerfen. Das geht ganz anaolg wie in Eclipse-Java.
Window -> Preferences -> C/C++ -> Code Style
Unter "Select a profile" kann man einen der vier Code Styles auswählen, mit "Edit" editieren oder mit "New" einen neuen entwerfen.
Der Codestyle wird als xml-Datei exportiert (gespeichert).
Window -> Preferences -> C/C++ -> Code Style -> Formatter -> Edit -> Export
Window -> Preferences -> C/C++ -> Code Style -> Import
Datei oder Projektnamen im Package Explorer markieren -> F2
Beim Umbenennen eines Projekts wird nur das Verzeichnis umbenannt. Ebenso beim Umbenennen von Dateien. Einträge in davon abhängigen Dateien werden also nicht geändert, hier muß. man von Hand umbenennen.
Wenn "gcc" deutsche Fehlermeldungen ausgibt, kann das zu Problemen führen da Eclipse/CDT nur englische Meldungen parsen kann. So können etwa aus Warnings dann Errors werden, was recht unangenehm sein kann. So führt etwa eine Zuweisung eines unsigned int auf ein int zu einer Fehlermeldung. Man kann das wie folgt abstellen:
Project -> Properties -> C/C++ Buils -> Environment
Hier geht man auf den Add-Button und trägt eines neues key/value Paar (LC_MESSAGES/en_US) ein.
Man kann F3 auch für die Funktionen und Makros aus den Headerdateien verwenden. Eclipse sucht dann die Deklaration in der zugehörigen Headerdatei. Es funktioniert übrigens auch mit den selbstgeschriebenen Headern.
Markieren des Funktionsnamen im Editor -> F3
Es kann sehr hilfreich sein, einen Blick in die Headerdateien zu werfen- Das Tastenkürzel ist sehr einfach. Es funktioniert übrigens auch mit den selbstgeschriebenen Headern.
Markieren der Headerdatei im Editor -> F3
Project -> Properties -> C/C++ Build -> Settings -> GCC C Compiler -> Includes
Hier auf das kleine grüne +-Symbol neben dem Text Include paths (-I) klicken. Man erhält einen kleinen Dialog mit dem man das Verzeichnis der Headerdatei angeben kann.
Project -> Properties -> C/C++ Build -> Settings -> MinGW C Linker -> Miscellaneous
Hier auf das kleine grüne +-Symbol neben dem Text Include paths (-I) klicken. Man erhält einen kleinen Dialog mit dem man die Datei eintragen kann. Man kann Sourcedateien und Objectdateien eintragen.
Beim Umbenennen oder Löschen von Projekten aktualisiert Eclipse CDT die Launch Configuration nicht oder nur unvollständig. Zu jeder Launch Konfiguration gehört eine xml-Datei im Verzeichnis
<eclipse workspace>/.metadata/.plugins/org.eclipse.debug.core/.launches
Sie trägt den Namen des Projekts, also etwa "MyProject Debug.launch". Man kann sie gefahrlos löschen und legt dann über Eclipse eine neue Launch Konfiguration an.
When ein Build nicht funktioniert so kann das mehrere Ursachen haben. Meistens hat noch Fehler im Programm. Aber auch wenn das Programm fehlerfrei ist kann ein Build schiefgehen. Z. Bsp. wenn in der Fehlermeldung sinngemäß die folgende Zeile auftritt.
c:/mingw/bin/... .../mingw32/bin/ld.exe: cannot open output file foo.exe: Permission denied
In diesem Fall läuft das Programm noch und der Linker kann keine neue exe-Datei erzeugen. Man kann dann das Programm mit dem kleinen roten quadratischen Button beenden, der sich im Konsolfenster unterhalb des Codefenster auf der rechten Seite befindet. Es kann allerdings vorkommen, daß das Programm läuft und obwohl kein roter Button zum Beenden angezeigt wird. In diesem Fall öffnet man den Windows Task Manager und sucht nach dem entsprechenden Programm.
Eclipse hat eine Rechtschreibprüfung, die in der Grundeinstellung eingeschaltet ist. Dann werden unbekannte Wörter rot unterringelt. Das kann nützlich sein, ist aber meist eher störend. So schaltet man sie ab:
Window -> Preferences -> General -> Editors -> Text Editors -> Spelling -> [ ] Enable spell checking (aushaken)
Das folgende kleine Programm läuft nicht so wie erwartet.
#include <stdio.h> #include <stdlib.h> int main(void) { puts("Hello World"); /* prints Hello World */ printf("Zahl eingeben: "); int zahl; scanf("%d", &zahl); printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Die Konsole bleibt leer. Am kleinen roten Quadradt sieht man allerdings, daß das Programm noch läuft!
Erhält das Konsolfenster den Fokus, so kann man eine Eingabe machen und erhält dann folgendes Ergebnis
Die Nachbildung (Emulation) der Windowskonsole von Eclipse für C/C++ hat noch einen Fehler. Eclipse kann unter Windows den Ausgabepuffer (also stdout und stderr) nicht löschen, sobald ein Programm auch Eingaben über die Konsole anbietet.
Es gibt zwei Möglichkeiten, diesen Fehler zu beheben. Entweder man leert den Tastaturpuffer mit einer entsprechenden Anweisung nach jeder Ausgabe oder man setzt ein generelles Statement am Anfang von main. Natürlich ist die letztere Lösung die einfachere.
Die Kommandos zum Löschen der Puffer von stdout, stderr und stdin lauten. Sowieso muß man in C nach einer Eingabe den Eingabepuffer selbst löschen, da bei einer falschen Eingabe die Zeichen im Tastaturpuffer hängenbleiben und bei der nächsten Eingabe zu unerwarteten Ergebnissen führen können.
fflush(stdout) fflush(stderr) fflush(stdin)
Hier bieten sich natürlich Makros mit define an, etwa:
#define FLI fflush(stdin) #define FLE fflush(stderr) #define FLO fflush(stdout)
Das Programm sieht nun so aus.
#include <stdio.h> #include <stdlib.h> #define FLI fflush(stdin) #define FLO fflush(stdout) int main(void) { puts("Hello World"); /* prints Hello World */ printf("Zahl eingeben: "); FLO; // muß vor scanf abgesetzt werden ! int zahl; scanf("%d", &zahl); FLI; printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Schöner ist natürlich die generelle Lösung. Mit Hilfe der Funktion setbuf() oder setbuf() läßt sich der Ausgabepuffer auf 0 setzen. Damit wird jede Ausgabe auf stdout oder stderr sofort geschrieben.
setbuf(stdout, NULL); setbuf(stderr, NULL);
Hier bieten sich natürlich ein Makros mit define an, etwa:
#define SETBUF setbuf(stdout, NULL); setbuf(stderr, NULL)
Damit sieht unser Programm nun so aus.
#include <stdio.h> #include <stdlib.h> #define FLI fflush(stdin) #define SETBUF setbuf(stdout, NULL); setbuf(stderr, NULL) int main(void) { SETBUF; puts("Hello World"); printf("Zahl eingeben: "); int zahl; scanf("%d", &zahl); FLI; printf("Die Zahl: %d", zahl); return EXIT_SUCCESS; }
Bei einer Aktualisierung von MinGW können sich Pfade von Include-Dateien ändern. Eclipse entfernt in diesem Fall die alten Pfade nicht, die dann permanent Warnings erzeugen. Eine sichere Methode, diese zu entfernen ist die folgende:
Man gehe in das folgende Verzeichnis
Arbeitsplatzfenster -> <Eclipse-Workspace-Verzeichnis> -> .metadata ->plugins ->org.eclipse.cdt.make.core
Hier sucht man sicht die Datei
<mein-projekt>.sc
Nun zuerst in Eclipse das Projekt schließen. Anschließend die Datei löschen und das Projekt wieder öffnen.
Hilft das nicht, dann nach dem Schließen des Projekts Eclipse beenden, die Datei löschen und Eclipse neu starten.
Die Einträge der Dropdownliste befinden sich in der Datei org.eclipse.ui.ide.prefs
Die Datei, die diese Einträge auflistet ist ziemlich versteckt. Für eclipse cdt liegt sie in folgendem Verzeichnis:
C:/Users/<my-username>/.eclipse/org.eclipse.platform_4.4.0_xxxxxxxxx_win32_win32_x86/configuration/.settings
Dabei ist xxxxxxxxx eine Folge von 9 Ziffern ist. Die Einträge der Dropdownliste erscheinen hier
in der zweiten Zeile nach RECENT_WORKSPACES=.
Das Trennzeichen für die Einträge ist \n.
Die Datei mit einem ASCII-Editor öffnen und die nicht mehr existierenden Verzeichnisse löschen.
Eclipse arbeitet mit einer Voreingestellten Zeilenlänge von 80 Buchstaben. Das ist für heutige Bildschirmauflösungen wenig. Besonders beim Nachformatieren von Code mit Hilfe von CTRL+SHIFT+F kommt es dabei zu unerwünschten Zeilenumbrüchen. Dies Einstellung kann man folgendermaßen ändern.
Window -> Preferences -> Code Style -> Edit (Button)
In dem jetzt erscheinenden Dialog aktiviert man das Tab Line Wrapping und trägt die gewünschte Zeilenlänge ein.