Use bibliotecas compartidas en / usr / local / lib


59

He compilado algunas bibliotecas de las fuentes, y los archivos posteriores make installestán en/usr/local/lib

Por ejemplo, en mi caso tengo el archivo libodb-2.2.soque está en este directorio.

Sin embargo, cuando inicio el ejecutable que se ha vinculado libodb, recibí el error: error al cargar bibliotecas compartidas:libodb-2.2.so: cannont open shared object file: No such file or directory.

¿Significa que he compilado mi ejecutable incorrectamente? ¿o debería indicarle al sistema que también puede haber algunas bibliotecas interesantes en la carpeta /usr/local/lib?

Estoy usando Ubuntu 12.04, Linux kernel 3.2.0-38-generic.



Te sugiero que hagas una buena relación de amistad con tu depurador
DDS

@DDS Sugiero que elabore un poco más. Sabes que es un sitio colaborativo aquí. Por favor, indique la forma en gdbque habría ayudado de todos modos con un linkproblema, por ejemplo. Soy realmente curioso. Al principio, su comentario me parece ajeno al problema. Pero puedo estar equivocado. De hecho, no sé lo suficiente gdb, y la carga de bibliotecas.
Stephane Rolland

Lo sentimos ... este comentario debería haberse colocado en stackoverflow en la pregunta de un alumno sobre la programación en C ... simplemente no se vio U&L
DDS

@DDS ¿Principiante en el aprendizaje de la programación en C o en el aprendizaje basado en Linux? Por favor, sé más preciso. Por ejemplo, venía de Windows. Eso no significa que no conozco C ++ ... Tiendo a pensar que tu comportamiento crítico no es exacto. Incluso si hubiera estado en SO, su comportamiento pronto llamará la atención de los moderadores. Se consciente de eso. Usted está en un sitio COLABORATIVO, de programadores entusiastas que comparten conocimientos útiles. No es un lugar diseñado para halagar tu ego. (No se preocupe, también he recibido un golpe suave / razonable cuando comencé SO, y creo que fue algo realmente bueno que sucedió).
Stephane Rolland

Respuestas:


59

Para la sesión actual puedes

export LD_LIBRARY_PATH = / lib: / usr / lib: / usr / local / lib

o para hacer el cambio permanente puede agregar /usr/local/liba /etc/ld.so.conf(o algo que incluye) y ejecutar ldconfigcomo root.

Si todavía tiene problemas, la ejecución ldd [executable name]le mostrará las bibliotecas que está tratando de encontrar y cuáles no se pueden encontrar.


3
Desde la manpágina ldd(1)"En el caso habitual, ldd invoca el enlazador dinámico estándar (ver ld.so(8)) con la LD_TRACE_LOADED_OBJECTSvariable de entorno establecida en 1, lo que hace que el enlazador muestre las dependencias de la biblioteca. Tenga en cuenta, sin embargo, que en algunas circunstancias, algunas versiones de lddmayo intente obtener la información de dependencia ejecutando directamente el programa. Por lo tanto, nunca debe emplear ldden un ejecutable no confiable , ya que esto puede resultar en la ejecución de código arbitrario. Una alternativa más segura cuando se trata de ejecutables no confiables es: ... "
SlySven

44
"... $ objdump -p /path/to/program | grep NEEDED"
SlySven

Bonito, nunca me he encontrado con objdump antes.
Flup

Según este artículo, esta respuesta es canónicamente incorrecta y dañina . Para un enfoque correcto, el uso de -Ly -rpathdurante la compilación para establecer la ruta de búsqueda de enlace y la ruta de búsqueda de tiempo de ejecución para las bibliotecas es la forma correcta, según esta pregunta y respuesta.
Cliff Armstrong

37

Si ya has corrido ldconfigdespués de construir la biblioteca, sigue leyendo. Si no, lea primero sobre ldconfig .

/usr/local/libpodría no estar en la ruta de la biblioteca que utiliza ldconfig. Puedes hacer esto:

ldconfig /usr/local/lib

Y las cosas deben agregarse a la memoria caché del vinculador, pero probablemente sea mejor agregar la ruta correctamente. Asegúrate de tener un /etc/ld.so.conf.ddirectorio. Si es así, agregue un archivo (llámelo "usr-local.conf", o lo que sea), y ponga una línea en él:

/usr/local/lib

Ahora corre ldconfig. Si no tiene el directorio ld.so.conf.d, debe tener un /etc/ld.so.conf archivo y puede agregar esa línea al final.


3
Agregué un archivo custom.conf para /etc/ld.so.conf.dsudoed ldconfig para tenerlo en cuenta y mi ejecutable puede comenzar ahora.
Stephane Rolland
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.