He compilado algunas bibliotecas de las fuentes, y los archivos posteriores make install
están en/usr/local/lib
Por ejemplo, en mi caso tengo el archivo libodb-2.2.so
que 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.
gdb
que habría ayudado de todos modos con unlink
problema, por ejemplo. Soy realmente curioso. Al principio, su comentario me parece ajeno al problema. Pero puedo estar equivocado. De hecho, no sé lo suficientegdb
, y la carga de bibliotecas.Respuestas:
Para la sesión actual puedes
o para hacer el cambio permanente puede agregar
/usr/local/lib
a/etc/ld.so.conf
(o algo que incluye) y ejecutarldconfig
como 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.fuente
man
páginaldd(1)
"En el caso habitual, ldd invoca el enlazador dinámico estándar (verld.so(8)
) con laLD_TRACE_LOADED_OBJECTS
variable de entorno establecida en1
, lo que hace que el enlazador muestre las dependencias de la biblioteca. Tenga en cuenta, sin embargo, que en algunas circunstancias, algunas versiones deldd
mayo intente obtener la información de dependencia ejecutando directamente el programa. Por lo tanto, nunca debe emplearldd
en 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: ... "$ objdump -p /path/to/program | grep NEEDED
"-L
y-rpath
durante 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.Si ya has corrido
ldconfig
después de construir la biblioteca, sigue leyendo. Si no, lea primero sobre ldconfig ./usr/local/lib
podría no estar en la ruta de la biblioteca que utiliza ldconfig. Puedes hacer esto: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.d
directorio. Si es así, agregue un archivo (llámelo "usr-local.conf", o lo que sea), y ponga una línea en él: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.fuente
/etc/ld.so.conf.d
sudoed ldconfig para tenerlo en cuenta y mi ejecutable puede comenzar ahora.