una tesis teorico sistema proyecto marco institucional implementacion hipotesis biblioteca linux gcc linker shared-libraries shared-objects

linux - tesis - proyecto implementacion biblioteca virtual



No puedo encontrar una biblioteca existente (7)

Estoy intentando vincular una aplicación con g ++ en este sistema lenny de Debian. 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.

Estoy llamando al enlazador con:

g++ -w (..lots of .o files/include directories/etc..) / -L/usr/lib -lmagic

l se queja:

/usr/bin/ld: cannot find -lmagic

Sin embargo, la libmagic existe:

$ 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?


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 suministrar todas las opciones apropiadas al compilador.

Ex:

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


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

  • g++ -l:libmagic.so.1 [...]
  • o: g++ -lmagic [...] , si tienes un enlace simbólico llamado libmagic.so en tu ruta libs

Como se mencionó anteriormente, el vinculador busca libmagic.so , pero solo tiene libmagic.so.1 .

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

ldconfig -v

Para verificar que puedes ejecutar:

$ ldconfig -p | grep libmagic


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

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


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ó como simplemente -lltdl en la marca.


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 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, debido a que la biblioteca se especifica como -lmagic para el enlazador, busca libmagic.so , por lo que es necesario para el desarrollo.

Ver Diego E. Pettenò: Enlazadores y nombres para 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 .


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