Aus LinuxUser 06/2004

So beheben Sie Fehler bei der Ausführung von make

Handgemacht

Wenn das configure-Skript fehlerfrei durchgelaufen ist, stehen nur noch make und make install zwischen dem Anwender und der neuen Software. Auch hier steckt der Teufel bisweilen im Detail.

Fehler bei make und make install sind ein Kuriosum, das es eigentlich gar nicht geben dürfte. Denn was das Programm make beim Kompilieren und Installieren einer Software tut, steht im Makefile, das das configure-Skript erstellt hat: Ermittelt es z. B., dass eine benötigte Bibliothek im Verzeichnis /usr/local/multimedia/lib liegt, landet diese Information als Aufrufparameter für den Compiler im Makefile.

Oberflächlich geprüft

Eigentlich sollte diese Datei daher perfekt auf Ihr System zugeschnitten sein und make fehlerfrei durchlaufen. Klappt das nicht, enthält im schlimmsten Fall der Quelltext des Programms einen Fehler. Dann sind Sie auf die Hilfe des Entwicklers angewiesen.

Manche Probleme bekommen Sie jedoch selbst in den Griff, z. B. das Problem schlampiger configure-Skripte, die nicht alle Voraussetzungen für einen erfolgreichen make-Aufruf abklären (Listing 1).

Geht für make etwas schief, gibt das Programm oft mehrere Dutzend Fehlermeldungen aus. Entscheidend ist die erste, bei allen weiteren handelt es sich um Folgefehler. In Listing 1 bricht make ab, weil der Compiler mimepp.h nicht findet. Dieser Fehler tritt auf, während er die Datei decodeRFC2047.cpp übersetzt: In Zeile 21 bemerkt er das Problem.

Bei einer eindeutigen Fehlermeldung wie mimelib/mimepp.h: No such file or directory muss Sie der zugehörige Quelltext nicht kümmern. Schauen Sie einfach mit urpmf mimepp.h (Mandrake Linux), pin mimepp.h (Suse Linux) oder der Dateisuche unter http://www.rpmseek.com/ nach dem Päckchen, in dem die vermisste Datei steckt.

Unter Mandrake Linux liefert die Suche kdenetwork-devel als Treffer. Nachdem Sie dieses Paket installiert haben, rufen Sie erneut make auf. Nun findet der gcc die Datei mimepp.h, und make bricht nicht mehr ab.

Listing 1

Abbruch wegen fehlender Prüfung im

configure

-Skript

[andi@doomtrain kshowmail-3.1.0-pre1]$ make[…]
decodeRFC2047.cpp:21:28: mimelib/mimepp.h: No such file or directory
decodeRFC2047.cpp: In function `QCString decodeQuotedPrintable(const QCString&)':
decodeRFC2047.cpp:40: error: `DwString' undeclared (first use this function)[…]
make[2]:  * [decodeRFC2047.o] Fehler 1
make[2]: Leaving directory `/home/andi/test/kshowmail-3.1.0-pre1/kshowmail'
make[1]:  * [all-recursive] Fehler 1
make[1]: Leaving directory `/home/andi/test/kshowmail-3.1.0-pre1'
make:  * [all] Fehler 2

Sehr selten „übersieht“ make Dateien, obwohl sie auf dem System vorhanden sind. Ein Beispiel dafür finden Sie im Artikel „Knopfleiste“ auf Seite 56.

Vergessliche Entwickler

Wer es sich zutraut, selbst etwas in den Programmcode einzufügen, beseitigt auch Fehler wie in Listing 2. Was so kryptisch daherkommt, pflücken Sie Stück für Stück auseinander: Der Compiler übersetzt gerade die Datei legacyimport.cpp, die am Anfang jeder Zeile auftaucht. In Zeile 143 steht KInputDialog, womit der Compiler nichts anzufangen weiß (undeclared (first use this function)). Undeclared („nicht deklariert“) bedeutet, dass die Klasse KInputDialog, die hier das erste Mal in einer Funktion zum Einsatz kommt, nirgendwo definiert ist, wo der Compiler nachschaut. Dadurch fehlt ein Teil Code, den er zum Übersetzen braucht: Er vermisst die Anweisungen, wie er ein Fenster mit Eingabezeile und Ok-Button erzeugt.

Um die vielen Arbeitsschritte, die ein solch komplexes Objekt erzeugen, nicht jedes Mal neu schreiben zu müssen, legen Programmierer sie in wiederverwertbaren Klassen ab. Brauchen sie ein Objekt dieser Klasse, rufen sie einfach den jeweiligen Konstruktor auf.

Klassen gehören zu den Schnittstellen eines Programms und werden bei C- und C++-Programmen daher normalerweise in den auf .h endenden Header-Dateien aus den Dev(el)-Paketen (siehe Seite 28) abgelegt. Damit alle an der Übersetzung beteiligten Programme diese Klassen finden, schreibt der Entwickler so genannte Include-Zeilen in den Quelltext:

#include <kmessagebox.h>

weist den Compiler an, Code einzubinden, der in der Datei kmessagebox.h in einem der Include-Verzeichnisse steht. Das sind die Verzeichnisse, die das Makefile dem Compiler als Option in der Form -I/hier/liegen/die/Includes mitgibt. Lautet die Zeile hingegen

#include "meininclude.h"

fehlen also die spitzen Klammern, verwendet der Compiler die Datei meininclude.h, die im selben Verzeichnis wie die zu übersetzende Datei liegt.

LinuxUser 06/2004 KAUFEN
EINZELNE AUSGABE Print-Ausgaben Digitale Ausgaben
ABONNEMENTS Print-Abos Digitales Abo
TABLET & SMARTPHONE APPS
Deutschland

Hinterlasse einen Kommentar

  E-Mail Benachrichtigung  
Benachrichtige mich zu: