¿Por qué tengo que definir LD_LIBRARY_PATH con una exportación cada vez que ejecuto mi aplicación?

Tengo un código que usa algunas bibliotecas compartidas (código c en gcc). Al comstackr, debo definir explícitamente los directorios de inclusión y biblioteca usando -I y -L, ya que no están en los lugares estándar. Cuando bash ejecutar el código, aparece 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, haz 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 bash ejecutar sync_test nuevamente, recibo el mismo error a menos que ejecute primero el comando de exportación. Intenté agregar lo siguiente a mi .bashrc, pero no hizo ninguna diferencia:

 LD_LIBRARY_PATH="/path/to/library/" 

Utilizar

 export LD_LIBRARY_PATH="/path/to/library/" 

en su .bashrc de lo contrario, solo estará disponible para bash y no para los progtwigs que inicie.

Pruebe -R/path/to/library/ marca cuando está vinculando, hará que el progtwig se vea en ese directorio y no necesitará 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 los binarios enlazados dinámicamente.

Debes evitar establecer LD_LIBRARY_PATH en tu .bashrc . Consulte ” Why LD_LIBRARY_PATH is bad ” para obtener más información.

Utilice la opción linker -rpath al enlazar para que el enlazador dynamic 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 progtwig, podría terminar usando las librerías en /path/to/library que pueden o no ser intencionadas.

¿Usted ‘exportó’ en su .bashrc?

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

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 anular la ruta de búsqueda de la biblioteca en tiempo de ejecución con LD_LIBRARY_PATH, en su lugar, podría hornearlo en el propio binario con rpath . Si enlaza con GCC agregando -Wl,-rpath, debería hacer el truco, si enlaza con ld es solo -rpath .

Lo que también puede hacer, si es algo que instaló en su sistema, es agregar el directorio que contiene las bibliotecas compartidas a su archivo /etc/ld.so.conf , o crear un nuevo archivo en /etc/ld.so. conf.d /

(He revisado RHEL5 y la distribución de Ubuntu, así que creo que es genérico para Linux)

El progtwig ldconfig se asegurará de que estén incluidos en todo el sistema.

Consulte el siguiente enlace para obtener más información: http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dlls.html

Podría agregar en su 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 sé, esa es la solución correcta, pero funciona.

Saludos