¿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/"
Author: sigjuice, 2009-03-30

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.

 40
Author: brian-brazil,
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.

 44
Author: sigjuice,
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"
 10
Author: bedwyr,
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

 10
Author: ,
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 23:12:29

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>.

 4
Author: fgp,
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

 2
Author: Roalt,
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

 0
Author: user3916212,
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