it-swarm.dev

ld no puede encontrar una biblioteca existente

Estoy intentando vincular una aplicación con g ++ en este sistema de Debian lenny. ld se queja de que no puede encontrar las 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 puedo diagnosticar más este problema y qué podría estar mal? ¿Estoy haciendo algo completamente estúpido?

160
maxpenguin

El problema es que el enlazador está buscando libmagic.so pero solo tienes libmagic.so.1

Un truco rápido es un enlace simbólico libmagic.so.1 a libmagic.so

149
grepsedawk

Como acaba de formularse por grepsedawk, la respuesta está en la opción -l de g++, llamando a ld. Si miras la página de manual de este comando, puedes hacer lo siguiente:

  • g++ -l:libmagic.so.1 [...]
  • o: g++ -lmagic [...], si tiene un enlace simbólico llamado libmagic.so en su ruta de acceso a las bibliotecas
65
Piotr Lesnicki

Es una 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, de modo que ese es el archivo que se carga cuando se ejecuta el ejecutable.

Sin embargo, debido a que la biblioteca está especificada como -lmagic al enlazador, busca libmagic.so, por lo que 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, debes apt-get install libmagic-dev. Esto no solo le dará libmagic.so sino también otros archivos necesarios para compilar como /usr/include/magic.h.

31
ephemient

En Ubuntu, puede instalar libtool que resuelve las bibliotecas automáticamente.

$ Sudo apt-get install libtool

Esto resolvió un problema con ltdl para mí, que se había instalado como libltdl.so.7 y no se encontró simplemente como -lltdl en la marca.

7
Mr Ed

A menos que esté muy equivocado, libmagic o -lmagic no es la misma biblioteca que ImageMagick. Usted declara que desea ImageMagick.

ImageMagick viene con una utilidad para suministrar todas las opciones apropiadas al compilador.

Ex:

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

Como se mencionó anteriormente, el enlazador está buscando libmagic.so, pero solo tienes libmagic.so.1.

Para resolver este problema simplemente realice un caché de actualización.

ldconfig -v 

Para verificar que puede ejecutar:

$ ldconfig -p | grep libmagic

Instalar libgl1-mesa-dev desde el repositorio de Ubuntu resolvió este problema por mí.

1
kirenpillay