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

title_2014_10

Digitale Ausgabe: Preis € 4,95
(inkl. 19% MwSt.)

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

Schnell Multi-Boot-Medien mit MultiCD erstellen
Schnell Multi-Boot-Medien mit MultiCD erstellen
Tim Schürmann, 24.06.2014 12:40, 0 Kommentare

Wer mehrere nützliche Live-Systeme auf eine DVD brennen möchte, kommt mit den Startmedienerstellern der Distributionen nicht besonders weit: Diese ...

Aktuelle Fragen

Windows 8 startet nur mit externer Festplatte
Anne La, 10.09.2014 17:25, 4 Antworten
Hallo Leute, also, ich bin auf folgendes Problem gestoßen: Ich habe Ubuntu 14.04 auf meiner...
Videoüberwachung mit Zoneminder
Heinz Becker, 10.08.2014 17:57, 0 Antworten
Hallo, ich habe den ZONEMINDER erfolgreich installiert. Das Bild erscheint jedoch nicht,...
internes Wlan und USB-Wlan-Srick
Gerhard Blobner, 04.08.2014 15:20, 2 Antworten
Hallo Linux-Forum: ich bin ein neuer Linux-User (ca. 25 Jahre Windows) und bin von WIN 8 auf Mint...
Server antwortet mit falschem Namen
oin notna, 21.07.2014 19:13, 1 Antworten
Hallo liebe Community, Ich habe mit Apache einen Server aufgesetzt. Soweit, so gut. Im Heimnet...
o2 surfstick software für ubuntu?
daniel soltek, 15.07.2014 18:27, 1 Antworten
hallo zusammen, habe mir einen o2 surfstick huawei bestellt und gerade festgestellt, das der nic...