Login
Login-Name Passwort


 
Newsletter
Mi, 31. August 2005, 13:01

»cannot find the library«-Fehler beheben

Es passiert manchmal, dass bei der Erstellung einer neuer Anwendung der Compilerprozess bei der Ausführung von libtool mit der vielsagenden Meldung »libtool: link: cannot find the library« seinen Dienst beendet. Was tun in solch einer Situation? Die Anwendung verwerfen? Nein, ein paar Änderungen können Abhilfe schaffen.

Um das Problem zu lösen, ist es zwar nicht notwendig, aber oftmals hilfreich, die Art der Meldung zu bestimmen. Dazu sollte man als erstes die Ausgabe von libtool ein wenig erweitern. Dazu öffnet man vor dem configure-Prozess die Datei ltmain.sh und sucht nach einem »cannot find the library«-Eintrag. Eine typische Stelle sieht folgendermaßen aus:

$echo "$modename: cannot find the library \`$lib'" 1>&2

Diese Zeile wird durch folgenden Eintrag ergänzt:

$echo "$modename: cannot find the library \`$lib' (lib${name}.la: $deplib)" 1>&2

Nun sollte das Tool etwas gesprächiger bei der Ausgabe sein. Damit ist das eigentliche Problem aber immer noch nicht behoben, denn wir erweitern nur den Output des Tools, ohne dass wir den Fehler behoben haben.

Die eigentliche Behebung des Problems kann auf zweierlei Arten erfolgen. Zum einen kann man das Default-Libtool der Distribution verwenden. Dazu muss das alte Script »ltmain.sh« durch das Distributionseigene aus dem Verzeichnis »/usr/share/libtool/« ersetzt werden.

# cd APPLIKATIONSDIR
# cp /usr/share/libtool/ltmain.sh ALTES_LTMAIN.SH

Sollte nach einem erfolgten »configure« und »make« das Problem immer noch nicht gelöst sein, kann man sich einer zweiten Methode bedienen.

Nicht selten ist es die -pthread-Bibliothek, die nicht korrekt eingebunden wird. Sieht man in der erweiterten Ausgabe von ltmain.sh am Ende der Bibliothek -pthread, so stehen die Chancen gut, den Fehler durch eine kleine Korrektur von ltmain.sh zu tilgen.

Dazu öffnet man die Datei ltmain.sh und sucht nach der Passage »esac # case $deplib« (um die Zeile 1537). Vor diese Zeile wird nun eine neue Zeile hinzugefügt mit dem Inhalt »-pthread) continue;;«. In einer Patch-Darstellung würde es folgendermaßen aussehen:

@@ -1534,6 +1534,7 @@
 alldeplibs=yes
 continue
 ;;
+ -pthread) continue;;
 esac # case $deplib
 if test "$found" = yes || test -f "$lib"; then :
 else

Nun sollte die Anwendung nach einem »./configure« und »make« wie erwartet compilert werden.

Pro-Linux
Pro-Linux @Facebook
Neue Nachrichten