2011-01-21 10 views
6

Estoy intentando compilar un programa Linux, id3v2, y que dice que es no puede encontrar la biblioteca adecuada:Programa de Linux no puede encontrar biblioteca compartida en tiempo de ejecución

id3v2: error while loading shared libraries: libid3-3.8.so.3: cannot open shared object file: No such file or directory 

estoy adivinando que esta es la parte que atrae a la biblioteca lidid3?

el archivo no existe, sin embargo, lo que estamos buscando es en realidad un enlace simbólico a:

"ibid3-3.8.so.3.0.0"

Me pregunto si es un problema no poder seguir los enlaces simbólicos? Quizás podría cambiarlo manualmente para buscar 0.0 si supiera dónde estaba buscando cambiarlo.

Me complace aclarar cualquier detalle.

Parece que los incluye se realizan de la siguiente manera:

id3v2: convert.o list.o id3v2.o genre.o 
     ${CXX} ${LDFLAGS} -pedantic -Wall -g -o [email protected] $^ -lz -lid3 

que fue capaz de utilizar el consejo de Simon a darse cuenta de que había múltiples puntos donde se podría esperar una biblioteca. Creé un enlace simbólico donde el programa estaba vinculando al archivo ACTUAL.

Gracias Simon!

+1

Su título pregunta sobre el encabezado, pero su pregunta claramente sobre la biblioteca compartida en tiempo de ejecución: - /. Puede verificar si funciona si agrega el directorio que contiene el enlace simbólico a su variable de entorno LD_LIBRARY_PATH. –

+0

claramente no entiendo lo que estoy haciendo. Intentaré leer su declaración y ver si puedo seguir su consejo. – Scott

+0

Esto podría ser prometedor ... http://stackoverflow.com/questions/3490667/compiler-not-following-symbolic-links-in-visual-studio-c – Scott

Respuesta

20

Los enlaces simbólicos en las bibliotecas funcionan bien, siempre y cuando el objetivo final que trazan exista y sea accesible.

Ha creado un archivo ejecutable enlazado dinámicamente, que desea vincular con libid3-3.8.so.3 en el momento de la ejecución. Esto probablemente se vinculó durante la fase de compilación con algo como -L/path/to/libid3/directory -lid3.

usted tiene algunas opciones hacer libid3 disponibles, en orden de preferencia general decreciente (ya que no ha mencionado donde estaba el archivo, sólo puedo ser general):

  • Crear un enlace simbólico a libid3* en un directorio que aparece en /etc/ld.so.conf (o /lib o /usr/lib)
  • Copia libid3* a un directorio que aparece en /etc/ld.so.conf (o /lib o /usr/lib) (por defecto)
  • Añadir al directorio que contiene libid3* a /etc/ld.so.conf
  • Conjunto LD_LIBRARY_PATH=/directory/path/to/libid3* antes de ejecutar el ejecutable id3v2.
  • Recompile id3v2 estáticamente. (Se trabajará, pero no se moleste.)

Después de cualquiera de los primeros 3, vuelva a ejecutar ldconfig por lo que el enlazador caché se actualiza. (Luego puede ejecutar ldconfig -v para verificar que se puede resolver.)

Tenga en cuenta que estos no son pasos, son opciones. Solo necesitas hacer 1 de ellos.

Me alegro de que hayas actualizado el título. #include directivas no tienen nada que ver con el enlace.

+0

Disculpa las directivas, siempre he incluido archivos en PHP, ColdFusion y de vuelta con ASP clásico. Entonces, pensé que "incluir" significaría que estaba incluyendo algo ... – Scott

+0

Está incluyendo algo: el encabezado, que contiene las declaraciones de funciones y tipos de variables, etc., para que el compilador conozca los tipos de variables, las firmas de métodos, etc. Esto es diferente de vincular a una biblioteca, que proporciona acceso a un código ejecutable concreto, ya sea incorporado o vinculado dinámicamente al ejecutable final. Puede ser confuso cuando se pasa de un lenguaje interpretado, ya que hay menos distinción (desde el punto de vista del programador, de todos modos) entre el código fuente y el código ejecutable. –

+0

Sí, literalmente NUNCA he hecho nada con un lenguaje compilado. Estoy seguro de que volveré a leer todo lo que ha escrito muchas veces. Gracias de nuevo. – Scott

3

me dieron el mismo error que hizo, y después de leer las soluciones mencionadas aquí, me ha resuelto el problema (en Ubuntu 8) con:

sudo ln -s /usr/local/lib/libid3-3.8.so.3 /usr/lib/libid3-3.8.so.3 
2

Esto resolvió el problema Sólo tiene que añadir/usr/local/lib a /etc/ld.so.conf (a menos que ya esté allí, solo póngalo una vez), luego ejecute ldconfig.

Cuestiones relacionadas