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.

Stephane Rolland
fuente
askubuntu.com/questions/165027/… , stackoverflow.com/questions/17889799/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
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.

Flup
fuente
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.

encerrada dorada
fuente
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