ld kann keine vorhandene Bibliothek finden

169

Ich versuche, eine Anwendung mit g ++ auf diesem Debian-Lenny-System zu verknüpfen. ld beschwert sich, dass bestimmte Bibliotheken nicht gefunden werden können. Das spezifische Beispiel hier ist ImageMagick, aber ich habe ähnliche Probleme mit einigen anderen Bibliotheken.

Ich rufe den Linker an mit:

g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic

ld beschwert sich:

/usr/bin/ld: cannot find -lmagic

Libmagic existiert jedoch:

$ locate libmagic.so
/usr/lib/libmagic.so.1
/usr/lib/libmagic.so.1.0.0
$ ls -all /usr/lib/libmagic.so.1*
lrwxrwxrwx 1 root root    17 2008-12-01 03:52 /usr/lib/libmagic.so.1 -> libmagic.so.1.0.0
-rwxrwxrwx 1 root root 84664 2008-09-09 00:05 /usr/lib/libmagic.so.1.0.0
$ ldd /usr/lib/libmagic.so.1.0.0 
    linux-gate.so.1 =>  (0xb7f85000)
    libz.so.1 => /usr/lib/libz.so.1 (0xb7f51000)
    libc.so.6 => /lib/i686/cmov/libc.so.6 (0xb7df6000)
    /lib/ld-linux.so.2 (0xb7f86000)
$ sudo ldconfig -v | grep "libmagic"
    libmagic.so.1 -> libmagic.so.1.0.0

Wie diagnostiziere ich dieses Problem weiter und was könnte falsch sein? Mache ich etwas völlig dummes?

Maxpenguin
quelle

Antworten:

158

Das Problem ist, dass der Linker sucht, libmagic.soaber Sie haben nurlibmagic.so.1

Ein schneller Hack ist ein Symlink libmagic.so.1zulibmagic.so

grepsedawk
quelle
3
das funktioniert, ich bin irgendwie ratlos, dass die Datei standardmäßig völlig nutzlos benannt wird - können Sie einen Einblick geben, warum dies standardmäßig der Fall ist?
Maxpenguin
5
Die Datei foo.so.1 ist auch ein Symlink zu foo.so.1.0.0. Auf diese Weise können Sie mehrere Versionen einer Bibliothek in Ihrem System haben. Wenn eine Anwendung eine bestimmte benötigt, kann sie mit dieser verknüpft werden, während im Allgemeinen die neueste von symlink ausgewählt wird. Ich weiß nicht, warum dieser Symlink fehlte.
Svante
46
libmagic.so.1 ist der Soname, der vom dynamischen Linker verwendet wird. libmagic.so wird vom Linker verwendet und befindet sich normalerweise zusammen mit den Headern im Paket -dev. Der Symlink fehlt möglicherweise, weil das Paket -dev nicht installiert wurde.
CesarB
13
Ich hatte das gleiche Problem ... anstatt den "Hack" zu machen, habe ich die "* -devel" -Version installiert und die Kompilierung behoben.
Trevor Boyd Smith
4
Wie kann man libmagic.so.1 mit libmagic.so symlinken? Und wo diese "Entwicklungs" -Pakete zu finden sind
Black
68

Wie gerade von grepsedawk formuliert, liegt die Antwort in der -lOption g++, anzurufen ld. Wenn Sie sich die Manpage dieses Befehls ansehen, können Sie entweder Folgendes tun:

  • g++ -l:libmagic.so.1 [...]
  • oder : g++ -lmagic [...], wenn Sie einen Symlink namens libmagic.so in Ihrem libs-Pfad haben
Piotr Lesnicki
quelle
Oder entfernen Sie zusammenfassend das libPräfix, wenn Sie es bei der Verwendung verknüpfen -l. -llibmagicsollte sein -lmagic.
Phyatt
31

Es ist eine Debian-Konvention, gemeinsam genutzte Bibliotheken in ihre Laufzeitkomponenten ( libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0) und ihre Entwicklungskomponenten ( libmagic-dev: /usr/lib/libmagic.so → …) zu unterteilen.

Da der Soname der Bibliothek lautet libmagic.so.1, ist dies die Zeichenfolge, die in die ausführbare Datei eingebettet wird. Dies ist also die Datei, die beim Ausführen der ausführbaren Datei geladen wird.

Da die Bibliothek jedoch als -lmagicLinker angegeben ist, wird nach ihr gesucht libmagic.so, weshalb sie für die Entwicklung benötigt wird.

Siehe Diego E. Pettenò: Linker und Namen für Details darüber, wie dies alles unter Linux funktioniert.


Kurz gesagt, sollten Sie apt-get install libmagic-dev. Dies gibt Ihnen nicht nur, libmagic.sosondern auch andere Dateien, die zum Kompilieren wie erforderlich sind /usr/include/magic.h.

kurzlebig
quelle
7

In Ubuntu können Sie installieren, libtoolwodurch die Bibliotheken automatisch aufgelöst werden.

$ sudo apt-get install libtool

Dies löste ein Problem mit ltdlfür mich, das installiert worden war libltdl.so.7und nicht so einfach -lltdlin der Marke gefunden wurde.

Herr Ed
quelle
es hat den Fehler nicht gelöst kann nicht gut -LGL . Könnten Sie bitte weitere Informationen darüber geben, was libtool macht und wie es Bibliotheksprobleme löst?
Shahryar Saljoughi
4

Es sei denn, ich irre mich stark libmagicoder bin -lmagicnicht dieselbe Bibliothek wie ImageMagick. Sie geben an, dass Sie ImageMagick möchten.

ImageMagick wird mit einem Dienstprogramm geliefert, mit dem dem Compiler alle geeigneten Optionen bereitgestellt werden.

Ex:

g++ program.cpp `Magick++-config --cppflags --cxxflags --ldflags --libs` -o "prog"
Brian Gianforcaro
quelle
4

Wie oben erwähnt, sucht der Linker libmagic.so, aber Sie haben nur libmagic.so.1.

Um dieses Problem zu lösen, führen Sie einfach einen Update-Cache durch.

ldconfig -v 

So überprüfen Sie, ob Sie Folgendes ausführen können:

$ ldconfig -p | grep libmagic
Miguel Ignacio Iglesias
quelle
1

Die Installation von libgl1-mesa-dev vom Ubuntu-Repo hat dieses Problem für mich behoben.

Kirenpillay
quelle
5
Sicherlich leiden Sie nicht unter dem gleichen Skriptfehler wie Maxpenguin im Jahr 2008.
Sophit
es hat mein Problem gelöst. Könnten Sie bitte mehr Informationen darüber geben, was es ist. und wie löst es dieses Problem? (Ich meine: libgl1-mesa-dev). danke
Shahryar Saljoughi