Para esta pregunta voy a estar utilizando un ejemplo específico, pero en realidad esto generaliza a casi cualquier binario en linux que no puede parecer encontrar sus bibliotecas dependientes. Por lo tanto, tengo un programa que no se ejecutará debido a las bibliotecas que faltan:
./cart5: error while loading shared libraries: libcorona-1.0.2.so: cannot open shared object file: No such file or directory
Ldd arroja alguna luz sobre el tema:
linux-vdso.so.1 => (0x00007fff18b01000) libcorona-1.0.2.so => not found libstdc++.so.6 => /usr/lib/gcc/x86_64-pc-linux-gnu/4.4.3/libstdc++.so.6 (0x00007f0975830000) libm.so.6 => /lib/libm.so.6 (0x00007f09755af000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00007f0975399000) libc.so.6 => /lib/libc.so.6 (0x00007f0975040000) libz.so.1 => /lib/libz.so.1 (0x00007f0974e2b000) /lib64/ld-linux-x86-64.so.2 (0x00007f0975b36000)
Sin embargo, corona está instalado:
oliver@human$ find / -name libcorona-1.0.2.so 2> /dev/null /usr/local/lib64/libcorona-1.0.2.so /home/oliver/installed/corona-1.0.2/src/.libs/libcorona-1.0.2.so
¿Cómo le digo al binario dónde buscar la biblioteca "que falta"?
Para una vez, establezca la variable LD_LIBRARY_PATH
en una lista de directorios separados por dos puntos para buscar. Esto es análogo a PATH
para ejecutables, excepto que los directorios estándar del sistema se buscan adicionalmente después de los especificados a través del entorno.
LD_LIBRARY_PATH=/usr/local/lib64 ./cart5
Si tiene un programa que mantiene las bibliotecas en una ubicación no estándar y no puede encontrarlas por sí mismo, puede escribir una secuencia de comandos de wrapper:
#!/bin/sh if [ -n "$LD_LIBRARY_PATH" ]; then LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib64 else LD_LIBRARY_PATH=/usr/local/lib64 fi export LD_LIBRARY_PATH exec /path/to/cart5 "$@"
La lista de directorios estándar del sistema se mantiene en /etc/ld.so.conf
. Los sistemas recientes permiten que este archivo incluya otros archivos; Si el suyo contiene algo como include /etc/ld.so.conf.d/*.conf
, cree un nuevo archivo llamado /etc/ld.so.conf.d/mala.conf
contiene los directorios que desea agregar. Después de cambiar /etc/ld.so.conf
o un archivo incluido, ejecute /sbin/ldconfig
para que los cambios surtan efecto (esto actualiza un caché).
( LD_LIBRARY_PATH
también se aplica a muchos otros unices, incluyendo FreeBSD, NetBSD, OpenBSD, Solaris y Tru64. HP-UX tiene SHLIB_PATH
y Mac OS X tiene DYLD_LIBRARY_PATH
. /etc/ld.so.conf
tiene análogos en la mayoría de los unices pero la ubicación y la sintaxis Difiere más ampliamente).
Si desea evitar LD_LIBRARY_PATH, también puede hacer esto, durante la vinculación:
gcc -o exename -L/path/to/dynamiclib/ -lnameofLib \ -Wl,-R/path/to/dynamiclib/ sourceCode1.c ...
El -Wl, … se utiliza para pasar comandos adicionales al vinculador y, en este caso, con -R le indica al enlazador que guarde esta ruta como "ruta de búsqueda predeterminada" para el .so.
Tengo notas de muchos pequeños consejos como éste, en mi sitio: