Advanced   Java   Services Eclipse CDT FAQ Back Next Up Home


Einleitung

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.


Anlegen eines C-Projekts

Etwas schneller geht es mit dem Kürzel Ctrl + n

eclipse-create-c-project-01.jpg

eclipse-create-c-project-02.jpg

eclipse-create-c-project-03.jpg

eclipse-create-c-project-04.jpg

eclipse-create-c-project-05.jpg


Anlegen eines C++-Projekts

Wie beim Anlegen eines C-Projekts beginnt man mit dem Kürzel Ctrl + n

eclipse-create-c++-project-01.jpg

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.

eclipse-create-c++-project-02.jpg


Compilieren und Linken (C und C++)

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.



eclipse-build-01.jpg

eclipse-build-02.jpg

eclipse-build-03.jpg


Run (C und C++)

Nach dem Build sollte bereits eine exe-Datei im Eclipse-Projektverzeichnis vorliegen.

eclipse-build-04.jpg

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.

eclipse-c-project-run-configuration-01.jpg

Dadurch erreichen wir den folgenden Dialog.

eclipse-c-project-run-configuration-02.jpg

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.

eclipse-c-project-run-configuration-03.jpg

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.


Hello World in C

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;
}

eclipse-cpp-hello-world.jpg


Hello World in C++

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;
}

eclipse-cpp-hello-world-2.jpg


Argumente an main()
Run -> Run Configurations... -> Tab Arguments aktivieren -> Argumente in das Textfeld "Program arguments" eintragen.

Aus- und Einkommentieren von Code
Zeilen markieren -> CTRL SHIFT /

Automatisches Speichern vor Run

Automatisches Speichern vor einem Build oder Run ist nicht voreingestellt. So ändert man das:

Window -> Preferences -> Run/Debug -> Launching

eclipse-cpp-save-before-launch.jpg

Radiobutton bei "Save required dirty editors before launching" setzen.


C99-Einstellungen
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.

eclipse-cdt-c99-einstellung.jpg


C++11-Einstellungen

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.

eclipse-cdt-c++11-einstellung.jpg


C++11-Funktionen werden von Eclipse nicht erkannt

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.

eclipse-cdt-c++11-cannot-resolve-1.jpg

Trotzdem läßt sich das Programm starten und zur Laufzeit werden die verwendeten Funktionen problemlos aufgerufen.

eclipse-cdt-c++11-cannot-resolve-2.jpg

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"

eclipse-cdt-c++11-cannot-resolve-3.jpg

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.


Codestyle ändern

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.

eclipse-cpp-bsd-codestyle.jpg


Codestyle exportieren

Der Codestyle wird als xml-Datei exportiert (gespeichert).

Window -> Preferences -> C/C++ -> Code Style -> Formatter -> Edit -> Export

Codestyle importieren
Window -> Preferences -> C/C++ -> Code Style -> Import

Dateien und Projekte umbenennen
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.


Fehlermeldungen auf Englisch anzeigen

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

eclipse-cdt-error-messages-01.jpg

Hier geht man auf den Add-Button und trägt eines neues key/value Paar (LC_MESSAGES/en_US) ein.

eclipse-cdt-error-messages-02.jpg

eclipse-cdt-error-messages-03.jpg


Funktionsdeklarationen in den Header-Dateien anspringen

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

(Standard-) Header-Dateien anzeigen

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

Header- und Sourcedateien (bzw. Objectdateien) einbinden, die außerhalb des Projekts liegen

Externe Headerdateien dem Projekt bekanntmachen
Project -> Properties -> C/C++ Build -> Settings -> GCC C Compiler -> Includes

eclipse-cdt-useexternalsource-01.jpg

eclipse-cdt-useexternalsource-02.jpg

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.

eclipse-cdt-useexternalsource-03.jpg


Externe Source-oder Objectdatei dem Projekt bekanntmachen

eclipse-cdt-useexternalsource-04.jpg

Project -> Properties -> C/C++ Build -> Settings -> MinGW C Linker -> Miscellaneous

eclipse-cdt-useexternalsource-05.jpg

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.

eclipse-cdt-useexternalsource-06.jpg


Launch Konfiguration löschen

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.


Permission denied Problem

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.


Rechtschreibprüfung abschalten

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)

Tastaturpufferproblem der Eclipsekonsole

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!

eclipse-keyboardbuffer-problem-01.jpg

Erhält das Konsolfenster den Fokus, so kann man eine Eingabe machen und erhält dann folgendes Ergebnis

eclipse-keyboardbuffer-problem-02.jpg

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;
}

Veraltete Eclipse CDT Builtin Include Directories entfernen

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.


Workspace Dropdownliste: Veraltete Einträge entfernen

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.


Zeilenlänge des Editors ändern

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.

eclipse-cpp-linelength.jpg

Valid XHTML 1.0 Strict top Back Next Up Home