Handgemacht

So beheben Sie Fehler bei der Ausführung von make

01.06.2004
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.

Da Sie in Listing 2 keine Meldung bekommen, dass eine Datei fehlt, hat der Programmierer wahrscheinlich vergessen, die Datei, die die Klasse enthält, einzubinden. Um dieses Missgeschick auszubügeln, gilt es, sie zu finden.

Das erledigt der Befehl grep, der Dateien nach einem Suchbegriff durchforstet. Den Anfang machen Sie im Quellcode-Verzeichnis bzw. in dessen Unterverzeichnis src. grep KInputDialog *.h sucht in allen auf .h endenden Dateien nach der Zeichenfolge KInputDialog. Im Beispiel führt das nicht zum Erfolg, denn KInputDialog ist eine allgemeine KDE-Klasse, die sich in den Include-Verzeichnissen des Systems befindet. Das sind gewöhnlich /usr/include und /usr/local/include, bei KDE manchmal aber auch /opt/kde3/include.

grep -r KInputDialog /usr/local/include/*

(-r für rekursiv) liefert auf unserem Beispielsystem gleich zwei Treffer: die Dateien kinputdialog.h und klineeditdlg.h. Der passende Eintrag in der zweiten ist nur ein Kommentar, aber die Zeilen aus kinputdialog.h sehen eindeutig so kompliziert aus, wie man sich eine Klasse (class) vorstellt:

/usr/local/include/kinputdialog.h:class KInputDialog : public KDialogBase
/usr/local/include/kinputdialog.h:    KInputDialog( const QString &caption, const QString &label,

Außerdem, auch das ist bei der Suche nach Klassendefinitionen ein gutes Omen, heißt die Datei wie die Klasse – nur kleingeschrieben. Um herauszufinden, ob wir richtig liegen, tragen wir in die Datei legacyimport.cpp unter alle anderen Include-Zeilen

#include <kinputdialog.h>

ein (Abbildung 1). make meldet danach keine Fehler mehr. Die beschriebene Methode führt natürlich nur zum Ziel, wenn die Include-Datei mit der passenden Definition bereits auf Ihrem System installiert ist.

Abbildung 1: Hinzugefügte Include-Zeile in legacyimport.cpp.

Listing 2

Fehlermeldung wegen vergessener Include-Zeile

[andi@doomtrain]$ make[…]
legacyimport.cpp: In member function `void KLegacyImport::finished()':
legacyimport.cpp:143: `KInputDialog' undeclared (first use this function)
legacyimport.cpp:143: (Each undeclared identifier is reported only once for each
function it appears in.)
legacyimport.cpp:143: parse error before `::' token
make:  * [legacyimport.o] Error 1

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 

Ähnliche Artikel

  • The Answer Girl
    Selbstkompilierte Software hat einen Nachteil: Ob sie sich später sauber deinstallieren lässt, hängt von der eigenen Disziplin ab. Zum Glück lässt sich der nachhelfen.
  • Wandlungsfähig
    Postscript-Dateien tauchen meist am Ende der Dokumentenerzeugung auf und werden nur selten nachbearbeitet. Mit Pstoedit konvertieren Sie sie in andere, editierbare, Dateiformate.
  • deskTOPia: xap
    Zum Programmstart muss es nicht immer ein Menü oder Desktop-Icon sein. Xap nähert sich der Aufgabe auf unkonventionelle Weise und entzieht sich so jedem Schubladendenken.
  • out of the box: MuSE
    Im Zeitalter von DSL machen genügend Bandbreite und Tools wie Icecast Live-Audio-Streaming vom eigenen Rechner aus möglich. Doch womit den Icecast-Server füttern? Mit MuSE steht eine komfortable Streaming-Quelle zur Verfügung.
  • Jo´s alternativer Desktop
    Wer kennt das nicht: Irgend etwas am System hängt, und ein – lästiger – Blick in die Log Files unter /var/log/ ist nötig, um den Übeltäter einzukreisen. Auch ohne akute Probleme ist es deutlich besser, immer informiert zu sein, um nicht erst nach einem "zu spät" in den Log-Files Ursachenforschung betreiben zu müssen. Mit "root-tail" erhalten Sie ohne Mausklicks alle gewünschten Informationen aus Log-Dateien – einfach auf dem Desktophintergrund.
Kommentare

Infos zur Publikation

Mit der Zeitschrift LinuxUser sind Sie als Power-User, Shell-Guru oder Administrator im kleinen Unternehmen monatlich auf dem aktuelle Stand in Sachen Linux und Open Source.

Sie sind sich nicht sicher, ob die Themen Ihnen liegen? Im Probeabo erhalten Sie drei Ausgaben zum reduzierten Preis. Einzelhefte, Abonnements sowie digitale Ausgaben erwerben Sie ganz einfach in unserem Online-Shop.

NEU: DIGITALE AUSGABEN FÜR TABLET & SMARTPHONE

HINWEIS ZU PAYPAL: Die Zahlung ist auch ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!       

Tipp der Woche

Ubuntu 14.10 und VirtualBox
Ubuntu 14.10 und VirtualBox
Tim Schürmann, 08.11.2014 18:45, 4 Kommentare

Wer Ubuntu 14.10 in einer virtuellen Maschine unter VirtualBox startet, der landet unter Umständen in einem Fenster mit Grafikmüll. Zu einem korrekt ...

Aktuelle Fragen

Admin Probleme mit Q4os
Thomas Weiss, 30.03.2015 20:27, 4 Antworten
Hallo Leute, ich habe zwei Fragen zu Q4os. Die Installation auf meinem Dell Latitude D600 verl...
eeepc 1005HA externer sound Ausgang geht nicht
Dieter Drewanz, 18.03.2015 15:00, 0 Antworten
Hallo LC, nach dem Update () funktioniert unter KDE der externe Soundausgang an der Klinkenbuc...
AceCad DigiMemo A 402
Dr. Ulrich Andree, 15.03.2015 17:38, 2 Antworten
Moin zusammen, ich habe mir den elektronischen Notizblock "AceCad DigiMemo A 402" zugelegt und m...
Start-Job behindert Bootvorgang, Suse 13.2, KDE,
Wimpy *, 20.02.2015 10:32, 4 Antworten
Beim Bootvorgang ist ein Timeout von 1 Min 30 Sec. weil eine Partition sdb1 gesucht und nicht gef...
Konfiguration RAID 1 mit 2 SSDs: Performance?
Markus Mertens, 16.02.2015 10:02, 6 Antworten
Hallo! Ich möchte bei einer Workstation (2x Xeon E5-2687Wv3, 256GB RAM) 2 SATA-SSDs (512GB) al...