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?
linux
gcc
linker
shared-libraries
shared-objects
Maxpenguin
quelle
quelle
Wie gerade von grepsedawk formuliert, liegt die Antwort in der
-l
Optiong++
, anzurufenld
. Wenn Sie sich die Manpage dieses Befehls ansehen, können Sie entweder Folgendes tun:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
, wenn Sie einen Symlink namens libmagic.so in Ihrem libs-Pfad habenquelle
lib
Präfix, wenn Sie es bei der Verwendung verknüpfen-l
.-llibmagic
sollte sein-lmagic
.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
-lmagic
Linker angegeben ist, wird nach ihr gesuchtlibmagic.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.so
sondern auch andere Dateien, die zum Kompilieren wie erforderlich sind/usr/include/magic.h
.quelle
In Ubuntu können Sie installieren,
libtool
wodurch die Bibliotheken automatisch aufgelöst werden.Dies löste ein Problem mit
ltdl
für mich, das installiert worden warlibltdl.so.7
und nicht so einfach-lltdl
in der Marke gefunden wurde.quelle
Es sei denn, ich irre mich stark
libmagic
oder bin-lmagic
nicht 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:
quelle
Wie oben erwähnt, sucht der Linker
libmagic.so
, aber Sie haben nurlibmagic.so.1
.Um dieses Problem zu lösen, führen Sie einfach einen Update-Cache durch.
So überprüfen Sie, ob Sie Folgendes ausführen können:
quelle
Die Installation von libgl1-mesa-dev vom Ubuntu-Repo hat dieses Problem für mich behoben.
quelle