webentwicklung-frage-antwort-db.com.de

Es kann keine vorhandene Bibliothek gefunden werden

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

Ich rufe den Linker mit:

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

ld beschwert sich:

/usr/bin/ld: cannot find -lmagic

Es gibt jedoch libmagic:

$ 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 kann ich dieses Problem weiter diagnostizieren und was könnte falsch sein? Mache ich etwas völlig Dummes?

162
maxpenguin

Das Problem ist, dass der Linker nach libmagic.so Sucht, aber Sie haben nur libmagic.so.1

Ein schneller Hack besteht darin, libmagic.so.1 Mit libmagic.so Zu verknüpfen.

152
grepsedawk

Wie gerade von grepsedawk formuliert, liegt die Antwort im -l Option von g++, ld aufrufend. Wenn Sie sich die Manpage dieses Befehls ansehen, haben Sie folgende Möglichkeiten:

  • g++ -l:libmagic.so.1 [...]
  • oder: g++ -lmagic [...], wenn Sie einen Symlink namens libmagic.so in Ihrem libs-Pfad haben
66
Piotr Lesnicki

Es ist 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 libmagic.so.1 Ist, ist dies die Zeichenfolge, die in die ausführbare Datei eingebettet wird. Dies ist also die Datei, die geladen wird, wenn die ausführbare Datei ausgeführt wird.

Da die Bibliothek für den Linker jedoch als -lmagic Angegeben ist, wird nach libmagic.so Gesucht, weshalb sie für die Entwicklung benötigt wird.

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


Kurz gesagt, Sie sollten apt-get install libmagic-dev. Dadurch erhalten Sie nicht nur libmagic.so, Sondern auch andere zum Kompilieren erforderliche Dateien wie /usr/include/magic.h.

31
ephemient

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

$ Sudo apt-get install libtool

Dies löste ein Problem mit ltdl für mich, das als libltdl.so.7 Installiert worden war und nicht einfach als -lltdl Im make gefunden wurde.

7
Mr Ed

Es sei denn, ich täusche mich stark libmagic oder -lmagic ist nicht die gleiche Bibliothek wie ImageMagick. Sie geben an, dass Sie ImageMagick möchten.

Im Lieferumfang von ImageMagick ist ein Dienstprogramm enthalten, das dem Compiler alle erforderlichen Optionen zur Verfügung stellt.

Ex:

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

Wie oben erwähnt, sucht der Linker nach libmagic.so, aber du hast 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 ausführen können:

$ ldconfig -p | grep libmagic

Das Installieren von libgl1-mesa-dev aus dem Ubuntu-Repo hat dieses Problem für mich gelöst.

1
kirenpillay