Estoy intentando vincular una aplicación con g ++ en este sistema Debian Lenny. ld se queja de que no puede encontrar bibliotecas especificadas. El ejemplo específico aquí es ImageMagick, pero también tengo problemas similares con algunas otras bibliotecas.
Estoy llamando al enlazador con:
g++ -w (..lots of .o files/include directories/etc..) \
-L/usr/lib -lmagic
ld se queja:
/usr/bin/ld: cannot find -lmagic
Sin embargo, existe 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
¿Cómo diagnostico más este problema y qué podría estar mal? ¿Estoy haciendo algo completamente estúpido?
linux
gcc
linker
shared-libraries
shared-objects
maxpenguin
fuente
fuente
Como acaba de formular grepsedawk, la respuesta está en la
-l
opción deg++
llamarld
. Si mira la página de manual de este comando, puede hacer lo siguiente:g++ -l:libmagic.so.1 [...]
g++ -lmagic [...]
si tiene un enlace simbólico llamado libmagic.so en su ruta libsfuente
lib
prefijo al vincularlo cuando lo use-l
.-llibmagic
debería ser-lmagic
.Es la convención de Debian separar las bibliotecas compartidas en sus componentes de tiempo de ejecución (
libmagic1: /usr/lib/libmagic.so.1 → libmagic.so.1.0.0
) y sus componentes de desarrollo (libmagic-dev: /usr/lib/libmagic.so → …
).Debido a que el nombre de la biblioteca es
libmagic.so.1
, esa es la cadena que se incrusta en el ejecutable, por lo que ese es el archivo que se carga cuando se ejecuta el ejecutable.Sin embargo, debido a que la biblioteca está especificada en cuanto
-lmagic
al enlazador, buscalibmagic.so
, por eso es necesaria para el desarrollo.Consulte Diego E. Pettenò: vinculadores y nombres para obtener detalles sobre cómo funciona todo esto en Linux.
En resumen, deberías
apt-get install libmagic-dev
. Esto no solo le darálibmagic.so
sino también otros archivos necesarios para compilar/usr/include/magic.h
.fuente
En Ubuntu, puede instalar lo
libtool
que resuelve las bibliotecas automáticamente.Esto resolvió un problema
ltdl
para mí, que se había instalado comolibltdl.so.7
y no se encontró simplemente-lltdl
en la marca.fuente
A menos que esté muy equivocado
libmagic
o-lmagic
no sea la misma biblioteca que ImageMagick. Usted declara que quiere ImageMagick.ImageMagick viene con una utilidad para proporcionar todas las opciones apropiadas al compilador.
Ex:
fuente
Como se mencionó anteriormente, el enlazador está buscando
libmagic.so
, pero usted solo tienelibmagic.so.1
.Para resolver este problema solo realice una actualización de caché.
Para verificar puedes ejecutar:
fuente
Instalar libgl1-mesa-dev desde el repositorio de Ubuntu resolvió este problema por mí.
fuente