¿Por qué tengo que definir la RUTA de la BIBLIOTECA LD con una exportación cada vez que corro mi aplicación?
Tengo un código que usa algunas bibliotecas compartidas (código c en gcc). Al compilar tengo que definir explícitamente los directorios include y library usando -I y-L, ya que no están en los lugares estándar. Cuando intento ejecutar el código, obtengo el siguiente error:
./sync_test
./sync_test: error while loading shared libraries: libsync.so: cannot open shared object file: No such file or directory
Sin embargo, haga lo siguiente, todo funciona bien:
export LD_LIBRARY_PATH="/path/to/library/"
./sync_test
Ahora, la parte extraña es que esto solo funciona una vez. Si intento ejecutar sync_test de nuevo obtengo el mismo error a menos que ejecute el comando exportar primero. Traté de añadir lo siguiente a mi .bashrc, pero no hizo ninguna diferencia:
LD_LIBRARY_PATH="/path/to/library/"
7 answers
Use
export LD_LIBRARY_PATH="/path/to/library/"
En su .bashrc de lo contrario, solo estará disponible para bash y no para ningún programa que inicie.
Prueba -R/path/to/library/
flag cuando estés enlazando, hará que el programa se vea en ese directorio y no necesitarás establecer ninguna variable de entorno.
EDITAR: Parece que -R
es solo Solaris, y estás en Linux.
Una forma alternativa sería agregar la ruta a /etc/ld.so.conf
y ejecutar ldconfig
. Tenga en cuenta que este es un cambio global que se aplicará a todos enlazados dinámicamente binario.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-04-12 02:44:13
Debe evitar establecer LD_LIBRARY_PATH
en su .bashrc
. Véase "Why LD_LIBRARY_PATH is bad
" para más información.
Use la opción del enlazador -rpath mientras enlaza para que el enlazador dinámico sepa dónde encontrar libsync.so
durante el tiempo de ejecución.
gcc ... -Wl,-rpath /path/to/library -L/path/to/library -lsync -o sync_test
EDITAR:
Otra forma sería usar una envoltura como esta
#!/bin/bash
LD_LIBRARY_PATH=/path/to/library sync_test "$@"
Si sync_test
inicia cualquier otro programa, podrían terminar usando las libs en /path/to/library
que pueden o no ser intencionadas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-06 10:06:58
¿Has 'exportado' en tu .bashrc?
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:"/path/to/library"
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-29 22:44:32
Puedes poner todo esto en una línea:
LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/path/to/library" ./sync_test
Debería hacer las cosas un poco más fáciles, incluso si no cambia nada fundamental
En lugar de sobrescribir la ruta de búsqueda de la biblioteca en tiempo de ejecución con LD_LIBRARY_PATH, podría hornearla en el binario mismo con rpath
. Si se enlaza con GCC añadiendo -Wl,-rpath,<libdir>
debería hacer el truco, si se enlaza con ld es solo -rpath <libdir>
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-07 15:58:03
Lo que también se puede hacer, si es algo que ha instalado en su sistema, es agregar el directorio que contiene las bibliotecas compartidas para su /etc/ld.así.conf archivo, o crear un archivo nuevo en /etc/ld.así.conf.d/
(He comprobado la distribución de RHEL5 y Ubuntu, así que creo que es genérica para linux)
El programa ldconfig se asegurará de que estén incluidos en todo el sistema.
Consulte el siguiente enlace para obtener más información información: www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-03-30 07:03:41
Podrías añadir en tu código un sistema de llamadas con la nueva definición:
sprintf(newdef,"export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:%s:%s",ld1,ld2);
system(newdef);
Pero, no lo sé esa es la solución correcta, pero funciona.
Saludos
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-24 22:01:41