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


356

El programa es parte de la suite de pruebas Xenomai, compilada de manera cruzada desde PC con Linux a la cadena de herramientas Linux + Xenomai ARM.

# echo $LD_LIBRARY_PATH                                                                                                                                          
/lib                                                                                                                                                             
# ls /lib                                                                                                                                                        
ld-2.3.3.so         libdl-2.3.3.so      libpthread-0.10.so                                                                                                       
ld-linux.so.2       libdl.so.2          libpthread.so.0                                                                                                          
libc-2.3.3.so       libgcc_s.so         libpthread_rt.so                                                                                                         
libc.so.6           libgcc_s.so.1       libstdc++.so.6                                                                                                           
libcrypt-2.3.3.so   libm-2.3.3.so       libstdc++.so.6.0.9                                                                                                       
libcrypt.so.1       libm.so.6                                                                                                                                    
# ./clocktest                                                                                                                                                    
./clocktest: error while loading shared libraries: libpthread_rt.so.1: cannot open shared object file: No such file or directory                                 

Editar: OK No noté que el .1 al final era parte del nombre del archivo. ¿Qué significa eso, de todos modos?


277
Esto podría suceder si recientemente instaló una biblioteca compartida y no ejecutó ldconfig (8) después. Haga 'ldconfig', no hay daño en ello.
AbiusX

25
+1 al comentario de @AbiusX: ejecutar sudo ldconfig (suponiendo que las bibliotecas estén de hecho donde deberían estar [/ usr / bin / lib /, / usr / bin / include /, / usr / local / lib / y / usr / local / include / AFAIK], corrígeme si me equivoco) puede resolver ese problema. ¡Salud!
AeroCross

Tenga en cuenta que este error también puede surgir si los permisos en su archivo lib cambiaron de alguna manera. Cambiar los permisos de nuevo a 644 lo resolvió para mí.
Geoffrey H

Respuestas:


140

Actualización
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 ha instalado un paquete, pero no ha instalado la versión "-dev" de ese paquete.


Bueno, no está mintiendo, no hay nada libpthread_rt.so.1en esa lista. Probablemente necesite reconfigurarlo y reconstruirlo de modo que dependa de la biblioteca que tenga, o instalar lo que sea 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 enlaces simbólicos foo.so y foo.so.1 apuntando a libfoo.so.1.0. Y si instala la versión 1.1 sin eliminar la otra, tendrá un 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 orip señaló en los comentarios, esto se explica bien en http://tldp.org/HOWTO/Program-Library-HOWTO/shared-libraries.html .

En su caso, usted puede salirse con enlaces simbólicos libpthread_rt.so.1a libpthread_rt.so. Sin embargo, no hay garantías de que no romperá su código y se comerá sus cenas de TV.


55
... oh dios, el .1 es parte del nombre del archivo. ¿Alguna idea de lo que significa?
zaratustra

orip merece un +1 para ese enlace. Si no te importa, @orip, ¿me gustaría poner tu enlace en la respuesta?
Paul Tomblin el

@PaulTomblin, recibo un error similar al reparar grub. ¿Me pueden ayudar con esto? Esta pregunta -> askubuntu.com/questions/123275/cant-repair-grub/…
Eray

@TomNysetvold y Paul, sí, es el mismo documento.
orip

Encontré mucha información mala y soluciones indirectas en mi búsqueda de esta respuesta. Algo dentro de mí me dijo que siguiera buscando hasta que encontrara una solución de comando único.
c ..

327

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

Para hacerlo, tendremos que seguir estos sencillos pasos:

(1) Encuentre dónde se ubica la biblioteca si no la conoce.

sudo find / -name the_name_of_the_file.so

(2) Verifique 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 del deseo, la exportamos y probamos la aplicación.

Tenga en cuenta que la ruta debe ser el directorio donde path.so.somethingestá. Entonces, si path.so.somethingestá adentro /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


3
La respuesta mencionada anteriormente fue muy clara, gracias en primer lugar. Intenté hacer esto en mi Eclipse CDT Project Path (Lubuntu). / Debug $ echo $ LD_LIBRARY_PATH /home/akhil/HDE/x86.linux/lib:/home/akhil/HDE/x86.linux/lib .. "/home/akhil/HDE/x86.linux/lib" aquí es donde mis bibliotecas están realmente disponibles incluso, pero sigo teniendo el mismo error. ¡Alguna sugerencia!
nahasapeemapetilon

12
Pruebe un comando "ldconfig" después de exportar su biblioteca. Es posible que deba ejecutar este comando como "sudo".
XOR

55
Todos los comandos en el paso (1) se pueden lograr findsolo:find / -name the_name_of_the_file.so
wbadart

3
Creo que LD_LIBRARY_PATHdebería apuntar al directorio que contiene path.so.something, no a path.so.somethingsí mismo.
gerrit

2
¡Seguir sus comandos paso a paso resolvió mi problema! ¡Gracias una tonelada!
Fisher Coder

156

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 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 verificaría la sugerencia de Paul y buscaría una versión "-dev" de la biblioteca. Muchas bibliotecas se dividen en paquetes dev y no dev. Puede 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 esté en un directorio no estándar. Por defecto, ldconfig se ve en /lib, /usr/liby aparece en los directorios /etc/ld.so.confy $LD_LIBRARY_PATH. Si su biblioteca está en otro lugar, puede agregar el directorio en su propia línea /etc/ld.so.conf, agregar la ruta de $LD_LIBRARY_PATHla biblioteca o moverla /usr/lib. Entonces corre ldconfig.

Para averiguar dónde está la biblioteca, intente esto:

sudo find / -iname *libraryname*.so*

(Reemplace librarynamecon el nombre de su biblioteca)

Si sigue la $LD_LIBRARY_PATHruta, querrá incluirla en su ~/.bashrcarchivo para que se ejecute cada vez que inicie sesión:

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

3
Por defecto, / lib y / usr / lib pero no / usr / local / lib? Eso me ha desconcertado varias veces durante mi carrera y ha desperdiciado horas.
DarenW

@DarenW Para mí trabaja con / usr / local / lib. Ubuntu 14.04 LTS.
gon1332

Agregar .confmis propios archivos con las rutas lib no estándar que necesito /etc/ld.so.conf.d(señalado por /etc/ld.so.conf) hizo el truco.
CivFan

44
+1 por la necesidad de ejecutar ldconfig. No estaba usando un administrador de paquetes. Tuve que compilar desde la fuente, así que esto era necesario.
Jeff

77
esta es la verdadera respuesta
Scott Stensland

53

Tuve un error similar, pude resolverlo dando,

sudo ldconfig -v

Espero que esto ayude.


37
Hola, esto puede resolver el problema ... pero sería bueno si pudieras editar tu respuesta y proporcionar una pequeña explicación sobre cómo y por qué funciona :) No lo olvides: hay un montón de novatos en el desbordamiento de Stack, y podrían aprender una o dos cosas de su experiencia: lo que es obvio para usted podría no serlo para ellos.
Taryn East

No podrá explicarlo. Él solo copió su respuesta.
Jhourlad Estrella

respuesta duplicada ... ver la misma respuesta anterior elaborada un día antes
Scott Stensland

25

Debe asegurarse de especificar la ruta de la biblioteca durante la vinculación cuando compila su archivo .c:

gcc -I / usr / local / include xxx.c -o xxx -L / usr / local / lib -Wl, -R / usr / local / lib

La parte -Wl, -R le dice al binario resultante que también busque la biblioteca en / usr / local / lib en tiempo de ejecución antes de intentar usar la que está en / usr / lib /

Espero que te ayude.


3
Esta es la opción que estaba buscando. Quizás mejor sería -Wl,-rpath DIR.
jrw32982 es compatible con Monica

1
¡estupendo! Enfrenté ese problema cuando mi programa se compiló con éxito con cmake pero no se pudo iniciar debido a un error. Esa respuesta resolvió mi problema
Ivan Talalaev

15

Intente agregar LD_LIBRARY_PATH, que indica rutas de búsqueda, a su ~/.bashrcarchivo

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/path_to_your_library

¡Funciona!


13

La página de referencia de linux.org explica la mecánica, pero no explica ninguna de las motivaciones :-(

Para eso, consulte Sun Linker y la Guía de Bibliotecas

Además, tenga en cuenta que el "control de versiones externo" es en gran parte obsoleto en Linux, porque el control de versiones de símbolos (una extensión GNU) le permite tener múltiples versiones incompatibles de la misma función para estar presentes en una sola biblioteca. Esta extensión permitió que glibc tuviera la misma versión externa: libc.so.6durante los últimos 10 años.


7
cd /home/<user_name>/
sudo vi .bash_profile

agregue estas líneas al final

LD_LIBRARY_PATH=/usr/local/lib:<any other paths you want>
export LD_LIBRARY_PATH

5

Tuve un error similar y no se solucionó al dar LD_LIBRARY_PATH en ~ / .bashrc. Lo que resolvió mi problema es agregando el archivo .conf y cargándolo. Ir a la terminal y estar en su.

gedit /etc/ld.so.conf.d/myapp.conf

Agregue la ruta de su biblioteca en este archivo y guárdela (por ejemplo: / usr / local / lib). Debe ejecutar el siguiente comando para activar la ruta:

ldconfig

Verifique su nueva ruta de biblioteca:

ldconfig -v | less

Si esto muestra los archivos de su biblioteca, entonces está listo para comenzar.


4

Otra posible solución dependiendo de su situación.

Si sabe que libpthread_rt.so.1 es lo mismo que libpthread_rt.so, puede crear un enlace simbólico de la siguiente manera:

ln -s /lib/libpthread_rt.so /lib/libpthread_rt.so.1

Entonces ls -l /libahora debería mostrar el enlace simbólico y a qué apunta.


4

Tuve este error al ejecutar mi aplicación con Eclipse CDT en Linux x86.
Para arreglar esto:

  1. En Eclipse:

    Ejecutar como -> Ejecutar configuraciones -> Entorno

  2. Establecer el camino

    LD_LIBRARY_PATH=/my_lib_directory_path
    

2

Todo lo que tenía que hacer era correr:

sudo apt-get install libfontconfig1

Estaba en la carpeta ubicada en /usr/lib/x86_64-linux-gnuy funcionó perfectamente.


2

Si está ejecutando su aplicación en Microsoft Windows, la ruta a las bibliotecas dinámicas (.dll) debe definirse en la variable de entorno PATH.

Si está ejecutando su aplicación en UNIX, la ruta a sus bibliotecas dinámicas (.so) debe definirse en la variable de entorno LD_LIBRARY_PATH.


1

intente instalar sudo lib32z1

sudo apt-get install lib32z1


1

El error ocurre ya que el sistema no puede referirse al archivo de biblioteca mencionado. Siga los siguientes pasos:

  1. Running locate libpthread_rt.so.1mostrará la ruta de todos los archivos con ese nombre. Supongamos que hay un camino /home/user/loc.
  2. Copia el camino y corre cd home/USERNAME. Reemplace USERNAME con el nombre del usuario activo actual con el que desea ejecutar el archivo.
  3. Ejecute vi .bash_profiley al final del LD_LIBRARY_PATHparámetro, justo antes ., agregue la línea /lib://home/usr/loc:.. Guarda el archivo.
  4. Cierre la terminal y reinicie la aplicación. Debería correr.

0

Recibí este error y creo que es la misma razón que la tuya.

error while loading shared libraries: libnw.so: cannot open shared object 
file: No such file or directory

Prueba esto. Corregir permisos en archivos:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 
chown -R root:root *

"Sudo su" para obtener permisos en su sistema de archivos.


0

Recibí este error y creo que es la misma razón que la tuya.

error al cargar bibliotecas compartidas: libnw.so: no se puede abrir el archivo de objeto compartido: No existe tal archivo o directorio

Prueba esto. Corregir permisos en archivos:

cd /opt/Popcorn (or wherever it is) 
chmod -R 555 * (755 if not ok) 


0

Yo uso Ubuntu 18.04

Instalar el paquete "-dev" correspondiente funcionó para mí,

sudo apt install libgconf2-dev

Recibí el siguiente error hasta que instalé el paquete anterior,

turtl: error while loading shared libraries: libgconf-2.so.4: cannot open shared object file: No such file or directory
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.