GNU/Linux >> Tutoriales Linux >  >> Linux

Error de Linux al cargar bibliotecas compartidas:no se puede abrir el archivo de objeto compartido:no existe tal archivo o directorio

Su biblioteca es una biblioteca dinámica. Debe decirle al sistema operativo dónde puede ubicarla en tiempo de ejecución.

Para hacerlo, necesitaremos seguir estos sencillos pasos:

(1 ) Encuentra dónde está ubicada la biblioteca si no la conoces.

sudo find / -name the_name_of_the_file.so

(2) Compruebe la existencia de la variable de entorno de ruta de biblioteca dinámica (LD_LIBRARY_PATH )

$ echo $LD_LIBRARY_PATH

si no hay nada que mostrar, agregue un valor de ruta predeterminado (o no, si lo desea)

$ LD_LIBRARY_PATH=/usr/local/lib

(3) Agregamos la ruta deseada, la exportamos y probamos la aplicación.

Tenga en cuenta que la ruta debe ser el directorio donde se encuentra el path.so.something es.Entonces si path.so.something está en /my_library/path.so.something debería ser :

$ LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/my_library/
$ export LD_LIBRARY_PATH
$ ./my_app

fuente:http://www.gnu.org/software/gsl/manual/html_node/Shared-Libraries.html


Aquí hay algunas soluciones que puede probar:

ldconfig

Como señaló AbiusX:si acaba de instalar la biblioteca, es posible que simplemente necesite ejecutar ldconfig.

sudo ldconfig

ldconfig crea los enlaces y la memoria caché necesarios para las bibliotecas compartidas más recientes que se encuentran en los directorios especificados en la línea de comandos, en el archivo /etc/ld.so.conf y en los directorios de confianza (/lib y /usr/lib).

Por lo general, su administrador de paquetes se encargará de esto cuando instale una nueva biblioteca, pero no siempre, y no le hará daño ejecutar ldconfig incluso si ese no es su problema.

Paquete de desarrollo o versión incorrecta

Si eso no funciona, también revisaría la sugerencia de Paul y buscaría una versión "-dev" de la biblioteca. Muchas bibliotecas se dividen en paquetes de desarrollo y no desarrollo. Puedes usar este comando para buscarlo:

apt-cache search <libraryname>

Esto también puede ayudar si simplemente tiene instalada la versión incorrecta de la biblioteca. Algunas bibliotecas se publican en diferentes versiones simultáneamente, por ejemplo, Python.

Ubicación de la biblioteca

Si está seguro de que está instalado el paquete correcto y ldconfig no lo encontró, es posible que se encuentre en un directorio no estándar. Por defecto, ldconfig busca en /lib , /usr/lib y directorios listados en /etc/ld.so.conf y $LD_LIBRARY_PATH . Si su biblioteca está en otro lugar, puede agregar el directorio en su propia línea en /etc/ld.so.conf , agregue la ruta de la biblioteca a $LD_LIBRARY_PATH , o mueva la biblioteca a /usr/lib . Luego ejecuta ldconfig .

Para saber dónde está la biblioteca, prueba esto:

sudo find / -iname *libraryname*.so*

(Reemplace libraryname con el nombre de tu biblioteca)

Si vas al $LD_LIBRARY_PATH ruta, querrás poner eso en tu ~/.bashrc archivo para que se ejecute cada vez que inicie sesión:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path/to/library

Actualizar
Si bien lo que escribo a continuación es cierto como una respuesta general sobre las bibliotecas compartidas, creo que la causa más frecuente de este tipo de mensajes es porque instaló un paquete, pero no instaló la versión "-dev" de ese paquete.

Bueno, no es mentira, no hay libpthread_rt.so.1 en ese listado. Probablemente necesite volver a configurarlo y reconstruirlo para que dependa de la biblioteca que tenga, o instale lo que proporcione libpthread_rt.so.1 .

En general, los números después de .so son números de versión y, a menudo, encontrará que son enlaces simbólicos entre sí, por lo que si tiene la versión 1.1 de libfoo.so, tendrá un archivo real libfoo.so.1.0, y los enlaces simbólicos foo.so y foo.so.1 que apuntan a libfoo.so.1.0. Y si instala la versión 1.1 sin eliminar la otra, tendrá una libfoo.so.1.1, y libfoo.so.1 y libfoo.so ahora apuntarán a la nueva, pero cualquier código que requiera esa versión exacta puede use el archivo libfoo.so.1.0. El código que solo se basa en la API de la versión 1, pero no le importa si es 1.0 o 1.1, especificará libfoo.so.1. Como señaló Orip en los comentarios, esto se explica bien en http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html.

En su caso, podría salirse con la suya enlazando libpthread_rt.so.1 a libpthread_rt.so . Sin embargo, no hay garantías de que no rompa tu código y se coma tus cenas de televisión.


Linux
  1. Mkdir:No se puede crear un directorio:¿No existe tal archivo o directorio?

  2. rpm:error al cargar bibliotecas compartidas:encabezado ELF no válido

  3. Rpm:error al cargar bibliotecas compartidas:Libz.so.1:no se puede abrir el archivo de objeto compartido:no existe tal archivo

  4. cp:directorio omitido – error al copiar un directorio en Linux

  5. "Error al cargar bibliotecas compartidas:libjli.so:no se puede abrir el archivo de objeto compartido:No existe tal archivo o directorio" Error de 'java -version' en el inicio

Cómo solucionar el error "pacman:error al cargar bibliotecas compartidas" en Arch Linux

libpulse.so.0:no se puede abrir el archivo de objeto compartido:no existe tal archivo o directorio

ImportError:libtk8.6.so:no se puede abrir el archivo de objeto compartido:no existe tal archivo o directorio

ImportError:libcblas.so.3:no se puede abrir el archivo de objeto compartido:no existe tal archivo o directorio

conda.exe:error al cargar bibliotecas compartidas:libz.so.1

touch:no se puede tocar `foo':No existe tal archivo o directorio