Aus RN-Wissen.de
Wechseln zu: Navigation, Suche


Dieser Artikel behandelt das Vorgehen bei Fehlermeldungen des GCC - C Compilers. Ziel des Artikels ist es eine Hilfestellung für Anfänger und Fortgeschrittene zu geben, wenn der Code mal nicht so kompilieren will wie man sich das vorstellt. Insbesondere soll der Artikel eine Ausgangsbasis für eine eigene Fehlerrecherche geben.

Die offizielle Dokumentation des GCC Compilers. Desweiteren sollte man auch die Warnungen des Compilers beachten, auch wenn sich der Code trotz der Warnungen kompilieren lässt (Deswegen sollte man auch immer mit der Option -Wall kompilieren). Prominentes Beispiel hierfür ist:


 int i = 10;
 if(i = 10) //Verwendung von "=" statt "==" , ruft Warnung aber keinen Fehlerhervor
 {
  //do some fancy stuff
 }


Um solche Fehler im Vorraus zu vermeiden kann man auch eine sogenannte statische Code Analyse durchführen. Hierbei wird der Code auf bestimmte Regeln und auch stilistische Fehler bzw. mögliche Fehlerquellen überprüft. Für C hilft hierbei das Tool Check. Hiermit kann z.B. erkannt werden ob man auf Arrays außerhalb ihrer Grenzen zugreift.

Probleme

  • Syntax - z.B.: "expected 'TOKEN' before 'TOKEN' token" - Fehlende schließende Klammer }
  • Linker - z.B: "undefined symbol"
  • Makefile - Inkorrekte Makefile Syntax - Datei im Makefile vergessen - Falsche Compileroptionen
  • Compilerbugs - Selten jedoch möglich. Ein Compiler ist ein unglaublich kompliziertes Werkzeug

Eine halbwegs vollständige Liste mit GCC Fehlermeldungen kann man Hier und Hier finden.

Probleme Lösen

Allgemein

Google is your friend, ist beim Programmieren fast immer wahr. Es gibt sogut wie keinen Fehler bzw. Problem beim Programmieren in C, dass nicht bereits jemand vor euch hatte und das online beantwortet wurde. Meiner Ansicht nach gibt es kein C - Syntax, Programmstruktur oder sonstiges Problem, das nicht bereits auf Stackoverflow behandelt wurde. Auch was das Programmieren von Mikrocontrollern anbelangt findet man im Roboternetz Forum oder auf mikrocontroller.net Lösungen zu den häufigsten Problemen.

An dieser Stelle sei auch noch auf das C-Tutorial im RN-Wiki verwiesen.

Syntax Probleme

Ganz einfach: man verwende die richtige Syntax. Das ist in manchen Fällen einfacher gesagt als getan. Der Compiler gibt einem jedoch in vielen Fällen die richtige Zeile aus und was er in dieser Zeile erwartet. Manchmal kann es jedoch vorkommen, dass ein Fehler an einer Stelle (z.B. ein fehlendes Semikolon) sich erst einige Zeilen später bemerkbar, indem die folgenden Zeilen in der Form nicht mehr kompilierbar sind. Deshalb: Überprüfe auch die Umgebung der angegeben Zeile. Das kann insbesondere bei vergessenen } passieren.

//Todo - Hier ein Auflistung der häufigsten Fehler einfügen

Linker Probleme

Linker Probleme treten auf, wenn der Linker bestimmte Funktionen nicht finden kann, auf die aber verwiesen wird. Beispiel: Man hat folgende 4 Dateien:

  • dateiA.c
  • dateiA.h
  • dateiB.c
  • dateiB.h

In der Headerdatei dateiB.h wird folgende Funtion deklariert: int dosomething(int i); Die dateiB.c bietet jedoch keine Implementierung hierfür. In der Codedatei dateiA.c wird nun das Headerfile dateiB.h eingebunden und die Funktion "dosomething(1)" aufgerufen. Der Compiler wird ohne Problem dateiA.c und dateiB.c compilieren. Wenn der Linker jedoch die Implementierung von "dosomething" sucht wird er sie nicht finden.

Derartige Fehler können auftreten wenn man z.B. eine C Datei im Makefile vergessen hat oder die Implementierung einer Funktion.

Compilerbugs

Bereits bekannte Bugs findet man hier. Auf der Seite ist auch alles angegeben um einen eigenen Bugreport zu verfassen. Um sicher zu gehen lohnt sich dabei immer ein Besuch auf Stackoverflow