2008-12-03 15 views
150

Estoy intentando vincular una aplicación con g ++ en este sistema Debian lenny. ld se queja de que no puede encontrar las bibliotecas especificadas. El ejemplo específico aquí es ImageMagick, pero también estoy teniendo problemas similares con algunas otras bibliotecas.ld no se puede encontrar una biblioteca existente

que llamo el 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 diagnosticar este problema adicional, y lo podría estar equivocado? ¿Estoy haciendo algo completamente estúpido?

Respuesta

138

El problema es el enlazador está buscando libmagic.so pero es suficiente libmagic.so.1

Un truco rápido es enlazar simbólicamente libmagic.so.1 a libmagic.so

+3

que funciona, yo soy una especie de perplejidad que sería el nombre del archivo de una manera completamente inútil por defecto - puede proporcionar alguna idea por qué lo haría esto por defecto? – maxpenguin

+0

Lo más probable es que se trate de una configuración incorrecta del script de instalación – grepsedawk

+5

El 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 es elegida por enlace simbólico. No sé por qué falta este enlace simbólico. – Svante

4

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

ImageMagick viene con una utilidad para proporcionar todas las opciones apropiadas para el compilador.

Ex:

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

Como se acaba formulado por grepsedawk, la respuesta está en la opción de -lg++, llamando ld. Si nos fijamos en la página del manual de este comando, puede hacer:

  • g++ -l:libmagic.so.1 [...]
  • o: g++ -lmagic [...], si usted tiene un enlace simbólico llamado libmagic.so en su camino libs
+0

O en resumen, elimine el prefijo 'lib' cuando lo vincule cuando use' -l'. '-llibmagic' debe ser' -lmagic'. – phyatt

30

Se es la convención de Debian para separar 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 → …).

Como el soname 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, como la biblioteca se especifica como -lmagic en el vinculador, busca libmagic.so, por lo que es necesario para el desarrollo.

Consulte Diego E. Pettenò: Linkers and names para obtener detalles sobre cómo funciona todo esto en Linux.


En resumen, debe 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.

6

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

$ sudo apt-get install libtool 

Esto resuelve un problema con ltdl para mí, que había sido instalado como libltdl.so.7 y no se ha encontrado como simplemente -lltdl en la composición.

+0

no resolvió el error ** no se puede corregir -LGL **. ¿podría darnos más información sobre lo que hace libtool y cómo soluciona los problemas de la biblioteca? –

1

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

+4

Seguramente no estás sufriendo el mismo error de script que maxpenguin en 2008. – Sophit

+0

resolvió mi problema. ¿podría darnos más información sobre qué es? y cómo soluciona este problema? (quiero decir: libgl1-mesa-dev). Gracias –

2

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

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

ldconfig -v 

Para verificar que puede ejecutar:

$ ldconfig -p | grep libmagic 
Cuestiones relacionadas