ld no puede encontrar una biblioteca existente

169

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?

maxpenguin
fuente

Respuestas:

158

El problema es que el enlazador está buscando libmagic.sopero solo tieneslibmagic.so.1

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

grepsedawk
fuente
3
eso funciona, estoy un poco perplejo porque nombraría el archivo de una manera completamente inútil de forma predeterminada. ¿Puede darnos alguna idea de por qué lo haría de manera predeterminada?
maxpenguin
55
Foo.so.1 también es un enlace simbólico a foo.so.1.0.0. De esta manera, puede tener varias versiones de una biblioteca en su sistema, y ​​si una aplicación necesita una específica, puede vincularla, mientras que, en general, la más nueva se elige por enlace simbólico. No sé por qué faltaba este enlace simbólico.
Svante
46
libmagic.so.1 es el soname, utilizado por el enlazador dinámico; libmagic.so es usado por el enlazador, y usualmente está junto con los encabezados en el paquete -dev. El enlace simbólico podría faltar porque el paquete -dev no estaba instalado.
CesarB
13
Tuve el mismo problema ... en lugar de hacer el "hack" instalé la versión "* -devel" y solucionó la compilación.
Trevor Boyd Smith
44
¿Cómo enlazar libmagic.so.1 a libmagic.so? Y dónde encontrar esos paquetes de "desarrollo"
Negro
69

Como acaba de formular grepsedawk, la respuesta está en la -lopción de g++llamar ld. Si mira la página de manual de este comando, puede hacer lo siguiente:

  • g++ -l:libmagic.so.1 [...]
  • o: g++ -lmagic [...]si tiene un enlace simbólico llamado libmagic.so en su ruta libs
Piotr Lesnicki
fuente
O, en resumen, elimine el libprefijo al vincularlo cuando lo use -l. -llibmagicdebería ser -lmagic.
phyatt
31

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 -lmagical enlazador, busca libmagic.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.sosino también otros archivos necesarios para compilar /usr/include/magic.h.

efímero
fuente
7

En Ubuntu, puede instalar lo libtoolque resuelve las bibliotecas automáticamente.

$ sudo apt-get install libtool

Esto resolvió un problema ltdlpara mí, que se había instalado como libltdl.so.7y no se encontró simplemente -lltdlen la marca.

Mr Ed
fuente
no solucionó el error no puede multar -LGL . ¿podría dar más información sobre qué hace libtool y cómo resuelve los problemas de la biblioteca?
Shahryar Saljoughi
4

A menos que esté muy equivocado libmagico -lmagicno 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:

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

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

Para resolver este problema solo realice una actualización de caché.

ldconfig -v 

Para verificar puedes ejecutar:

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

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

kirenpillay
fuente
55
Seguramente no estás sufriendo el mismo error de script que maxpenguin en 2008.
Sophit
resolvió mi problema ¿podría dar más información sobre qué es? ¿Y cómo resuelve este problema? (Quiero decir: libgl1-mesa-dev). gracias
Shahryar Saljoughi